码迷,mamicode.com
首页 > 其他好文 > 详细

如何高效地产生多个不重复的随机数?

时间:2016-10-04 13:52:43      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

如何高效产生多个不重复的随机数

 

类型一: 完全范围内的随机数

  • 举例:  在整数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赋予它;否则,就重新随机产生另一个位置,直到整个数组

被填满。这个方法,越到后面,遇到已使用过的元素的可能性越高,重复次数就越多,这是不及第一个方

法的地方,但总的来说,效率还是不错的。

如何高效地产生多个不重复的随机数?

标签:

原文地址:http://www.cnblogs.com/tsingke/p/5930293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!