如何高效地产生多个不重复的随机数?
2016-10-04 12:06
405 查看
如何高效产生多个不重复的随机数
类型一: 完全范围内的随机数举例: 在整数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 GenerateDiffNumber(int *diff,int maxn,int num) 2 { 3 int rnd; 4 int *tmp; 5 tmp = (int *)malloc(sizeof(int)*maxn); 6 7 //1.初始化 8 for (int i = 0; i < maxn; i++) 9 { 10 tmp[i] = i; 11 } 12 13 //2.产生num个不同的数 14 for (int i = 0; i < num; i++) 15 { 16 do 17 { 18 rnd = rand() % maxn;//rnd<maxn 19 20 } while (tmp[rnd]==-1); 21 22 diff[i] = rnd; 23 tmp[rnd] = -1; //该位置的数已被选择过,将其标记为-1 24 } 25 26 free(tmp); 27 }
这段代码也是随机产生位置,但它预先把整个数组初始化为位置序号,然后随机产生其中一个位置,如果该元素
值不为-1,表示这个位置还没有被使用过,就把i赋予它;否则,就重新随机产生另一个位置,直到整个数组
被填满。这个方法,越到后面,遇到已使用过的元素的可能性越高,重复次数就越多,这是不及第一个方
法的地方,但总的来说,效率还是不错的。
相关文章推荐
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 算法:如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何高效产生m个n范围内的不重复随机数(m<=n)
- 如何产生1-100之间的100个不重复的随机数
- matlab如何产生不重复的随机数(转)
- [转] 高效的产生一组不重复的随机数
- 【Unity&C#&随机数】如何产生连续不重复的随机数
- 如何产生1-100 之间的100个不重复的随机数
- 如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些比较是多余的,
- 如何产生一个不重复的随机数
- 如何产生n个不重复的随机数
- 如何快速产生一个1-n的无重复随机数序列