产生不重复的随机数

产生n个不重复的随机数 一.去重法        这是最容易想到的方法,逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。可以使用hashtable或数组标记,这种方法效率比较低,且比较次数呈线性增长,越往后次数越多。 二.筛选法        所谓“筛选法”就是根据要产生随机数指定的范围(起始数必须小于终止数),将这些数全部装入一个数组,然后利用系统随机函数(比如 Random )随 阅读详情
看到这个问题了:
随机取 m 个数(在 1 到 n 的范围之内),(m <= n),要求 m 个数没有重复。
有没有什么好的算法,时间复杂度和空间复杂度都很好。


// 随机取 m 个数(在 1 到 n 的范围之内),(m <= n),要求 m 个数没有重复。
// 有没有什么好的算法,时间复杂度和空间复杂度都很好。
// 方法 1 :生成一系列的随机数,重复的丢弃,利用 STL 的 set 可以方便地插入非重复元素。
// 缺点是浪费时间。
// 方法 2 :洗牌算法,用一个数组保存 1,2, 。。。,n 这些数,然后历遍数组,每次生成一个
// 随机数,作为下标,交换当前元素。然后取数组的前 m 个元素。缺点是浪费空间。
// 2007-07-23
// By rappizit@yahoo.com.cn

#include 
<iostream>
#include 
<set>
#include 
<vector>
#include 
<stdlib.h>
#include 
<time.h>
using namespace std;

void randomNexclusive(int n, int m)
{
    
if (n < m)
        
{
        
return;
        }

    
int r;
    
set <int> s;
    
while (1)
        
{
        r 
= rand () % n + 1;
        s.insert (r);    
// set 底层实现是红黑树,插入复杂度是对数级的
        if(s.size () == m)
            
{
            
break;
            }

        }

    copy (s.begin (), s.end (), ostream_iterator 
<int> (cout, " "));
    cout 
<< endl;
}


void shuffle (int n, int m)
{
    
if (n < m)
        
{
        
return;
        }

    vector 
<int> v (n + 1);
    
int r, i;
    
for (i = 1; i <= n; i ++)
        
{
        v [i] 
= i;
        }

    
for (i = 1; i <= n; i ++)
        
{
        r 
= rand () % n + 1;
        swap (v [i], v [r]);
        }

    
for (i = 1; i <= m; i++)
        
{
        cout 
<< v [i] << " ";
        }

    cout 
<< endl;
}


void main ()
{    // 此句必不可少,否则生成相同序列,放到函数 randomNexclusive () 里面也不好
    srand ((unsigned) time (NULL));    
    randomNexclusive (
1000, 100);
    cout 
<< endl;
    shuffle (
1000, 100);
}

不过我认为这两个算法都还是能够满足一般要求的。
如何产生n个不重复的随机数 问题:如何得到n个互相不重复的随机数? 如何实现randperm(n)的效果呢?本文提供了三种思路。 阅读详情

相关推荐

论文解析-sciPENN

用这2个CITE-seq共有的protein作为训练集,分别将他们特有的protein作为测试集,评估sciPENN对CITE-seq数据集中缺失的protein丰度预测准确度。来自Seurat 4 的PBMC数据集,样本被注射水疱性口炎病毒 (VSV) 载体 HIV 疫苗,数据集包含每个样本注射疫苗0天、3天、7天的CITE-seq数据。PBMCs作为训练集,MALT作为测试集,利用scRNA-seq测试17个蛋白质表达水平。Monocyte:随机取4个样本作为训练集,剩余4个样本作为测试集。

weixin_46065198的博客 1022

生成全不相同的随机数

定义一个数组,有是个成员,存储10个不同的从0~9的随机数,代码如下。在G++下测试通过。 #include #include #include using std::cout; using std::endl; const int nrNum = 10; void get_rand(void); void get_rand(int A[], int size) {

Tyrion Lannister's Special column 741

STM32F103C8T6的PC13-15引脚配置避坑指南:为什么你的IO口不工作?

本文详细解析了STM32F103C8T6的PC13-15引脚作为普通IO口不工作的原因及解决方案。这三个引脚默认关联侵入检测和低速外部时钟等特殊功能,需先禁用TAMPER和LSE,并开启AFIO时钟,才能正确配置为普通GPIO。文章提供了标准外设库和HAL库的配置步骤、常见问题排查方法及硬件设计注意事项。

weixin_29169899的博客 522

生成无重复的随机数

  摘自:http://www.cppblog.com/pengkuny/archive/2006/11/12/15057.html生成无重复的随机数,注意,是不重复的序列.   通常的生成随机数的做法是不考虑重复的,因为即使重复也属于概率意义上的正常情况.但某些情况下需要不重复的随机数据,怎么办呢?   我想从大方向上来说,应该只有两个方法.要么牺牲时间要么牺牲空间.讲得不对或不完整,大家一

SearchLife的专栏 1618

集成电路模拟版图入门-版图基础学习笔记(四)

第三部分:版图的准备 2. 设计规则 3) Design Rule 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.2 PO(Poly) 2. 设计规则 4) 规则定义 4.3 M1(Metal1) 2. 设计规则 4) 规则定义 4.4 VIA 3. DRC文件 3.1 DRC:Design Rule Check,设计规则检查。 3.2 DRC程序了解有关

weixin_52955333的博客 6735

使用 Wireshark 分析 PPPoE 流量中的 BRAS 名称 AC-Name

客户端发出广播请求,寻找 PPPoE 服务器。: BRAS 服务器响应 PADI 请求,提供服务并包含AC-Name。: 客户端选择一个 BRAS 并发起连接请求。: BRAS 确认连接并分配会话 ID。在这些阶段中,AC-Name是 BRAS 提供的一个关键字段,用于标识服务器名称。

caca_66的博客 2066

R语言处理数据——生成随机数

生成随机数 #如下连续生成16组1:3的随机不重复整数(每次3个),存储至repl中: repl <- NULL for(x in 1:16) {repl <- c(repl, sample(1:3, 3, replace = F))}

小八四爱吃甜食的博客 3213

Excel曲线拟合实战:从基础趋势线到高级回归分析

本文系统介绍了Excel曲线拟合的完整工作流,从基础的散点图与趋势线应用,到利用Solver插件进行自定义高级回归分析。文章详细讲解了线性、多项式、指数、对数等六大常用数学模型的适用场景与选择方法,并强调了通过R²值、残差图评估拟合效果、避免过拟合与外推风险的关键步骤,帮助读者掌握从数据探索到预测评估的实战技能。

weixin_29280219的博客 536

RAP简介教程&常用规则

上篇文章浅谈了mock数据的工具对比,在实际使用过程中,需要mock的数据包含各种语法规则、数据规律等等,最完善的规则建议还是参考MOCK.js教程,但是,这里就需要了解下RAP在使用时常用的一些写法了。 首先我们先看下RAP的整个页面: 日常使用主要涉及几个模块: 接口简介 主要是接口地址、接口类型等等 请求参数 可以分为三类: 1、headers:一般头部放置验证参...

weixin_33937913的博客 3433

ad23新版Geber导出-官方教程(22.11版本后)

AD23新版本geber文件导出(含官方教程)-22.11之后的版本均可用此教程

安和的博客 3万+

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

VB中产生10个不重复的随机数

前几天听了米老师的课,才知道自己真的是学得都是似懂非懂,“一桶水不满,半桶水晃荡”这个比喻是最恰当不过了。         米老师经常告诉我们说要脚踏实地地学习,那何为脚踏实地呢?我的理解是把你在哪一方面不懂的知识学会就是脚踏实地,就比如说用VB产生10个随机数,我们看着好像会了,但没有真正地去实现过;或者说我们已经实现了,但没有去总结,当真正要用到的时候,却摸不着头脑,不知如何去做。

搬砖工 3万+

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1344

C++产生一定范围内不重复的随机数

使用random_shuffle洗牌函数产生随机序列(两种形式) 方法一: vector<int> random_permut_1(int n) { vector<int> temp; for (int i = 0; i < n; i++) temp.push_back(i); std::random_shuffle(tem...

loveC__的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何产生不重复的随机数

package 如何产生不重复的随机数; import java.util.Random; public class Rand { public static void main(String[] args) { //产生随机数的类 Random random = new Random(); // 装随机数的数组 10个整数 int[] num = new int[10];

面包侠的博客 3328

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

产生不重复随机数

最近想做一个小游戏,其中用到产生不重复随机数!~~~自己写了

boboidea 634

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于产生不重复随机数的算法 C#

我们不得不承认这样一个事实:那就是尽管在高级程序语言设计中包含了类似于Random产生随机数之类的方法,但是它产生的随机数并不能满足我们日常所有需要,因为它可能重复——设想一下,电子化抽取试题的原理就是根据预定产生的题目数量产生果敢若干个对应的随机数,然后将匹配的试题抽取、排序并打印在试卷上。但是在同一次考试时候不允许同一题目出现重复(尽管这样的概率很低,但是我们绝对不允许这样做!)。所以避免产生

iceberg的专栏 1676

产生不重复随机数的方法

      我在青鸟学习的时候,遇到过这样的问题。老师给的方法感觉有点不太好。产生的数是从大到小排列的,感觉不太舒服。在网上也搜过一些。也没有得到满意答案(可能因为自己没有看懂,或方法不对吧)。      经过自己的努力,终于有了答案,拿出来和大家分享。各位老大,哪里有不足和更好的方法请指教。(在vs2005环境,C#语言中实现的) public partial class

十狐狸的专栏 657

WPF产生不重复的随机数

WPF产生不重复的随机数 在给定的区间范围(比如[50,99]),产生给定数量的随机数(不如10个),要求产生的随机数不重复首先给定变量min=50;max=99+1;//习惯与程序规定的编码不同所致n=10;好了,上代码1.xaml界面格式 <Grid> <TextBlock x:Name="tb_Screen" HorizontalAlignment...

weixin_33980459的博客 322

5位随机数重复的概率 php_PHP产生不重复随机数的5个方法总结

无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地。在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下方法一:$numbers = range (1,50);//shuffle 将数组顺序随即打乱shuffle ($numbers);//array_slice 取该数组中的某一段$num=6;$result = ...

weixin_39883256的博客 145

随机不重复排序算法及Java产生随机数的3种方式

问题描述        给定任意个不重复的数字,对其进行随机排序 算法分析        首先想到可以将给定的数字放在一个集合A中,初步定为一个ArrayList,这样,可以用A集合的长度来做为随机数的基数,取出一个数x,放到结果集合B中,然后将数x从A集合删除;接着用A集合剩下的长度作为基础重复上一步操作,最终可以得到结果集合B。考虑到用Arraylist删除比较慢,可以用Link

单向街的夏天 5323

如何让C#产生不重复的随机数

<br />在.net Framework中提供了一个专门用来产生随机数的类System.Random。<br /><br /> <br /> <br /> <br /><br />  但是用Random类生成id号,会出现重复,特别是在数量较小的范围内中要生成不重复的是很难的,参考了网上的一些方法,包括两类,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重复;第二类是使用一些数据结构和算法。下面主要就第二类介绍几个方法。<br /><br />方法1:思想是用一个数组来保存索引号,先随机生成一个

AmyXu 2896

c51随机数不重复_C 语言产生随机数的方法

在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int...

weixin_42108054的博客 1031
上一篇: 数论的欧拉定理证明 &amp;amp; 欧拉函数公式
下一篇: TopCoder SRM 360 DIV2 500 分题目, 需要排列组合么?需要强力法么?
Rappy
博客等级 码龄20年 48粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值