首页 > 代码库 > 如何高效地产生多个不重复的随机数?
如何高效地产生多个不重复的随机数?
如何高效产生多个不重复的随机数
类型一: 完全范围内的随机数
- 举例: 在整数1-100以内, 产生100个不同的随机整数
- 思想: 将所有数字打乱, 按顺序选取各个数
1 int a[100]; 2 3 //1.初始化:按序列号依次赋值 4 for(int i=0; i<=99; ++i) 5 { 6 a[i]=i; 7 } 8 //2.生成不同的随机数序列 9 for(int i=99; i>=1; --i) 10 {11 swap(a[i], a[rand()%i]);12 }
上面这段代码只需要遍历一次就可以产生这100个不重复的随机数.
类型二: 部分范围内的多个不同的随机数
- 举例: 在整数1-100以内, 产生20个不同的随机整数
- 思想: 标记无冲突法
1 void GenerateDifferentNumber(double *array, int Max, int num) 2 { 3 //1.初始化:标记为0 4 for (int i = 0; i < Max; i++) 5 { 6 array[i] = 0; 7 8 } 9 10 //2.标记无冲法产生多个随机数11 for (int i = 0; i < num; i++)12 {13 int rnd = rand() % Max;14 15 while (array[rnd]==0)16 {17 array[rnd] = i;18 }19 20 }21 22 }
这段代码也是随机产生位置,但它预先把整个数组初始化为0,然后随机产生其中一个位置,如果该元素
值为0,表示这个位置还没有被使用过,就把i赋予它;否则,就重新随机产生另一个位置,直到整个数组
被填满。这个方法,越到后面,遇到已使用过的元素的可能性越高,重复次数就越多,这是不及第一个方
法的地方,但总的来说,效率还是不错的。
如何高效地产生多个不重复的随机数?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。