注册 登录
编程论坛 C++教室

生产大量无序随机数

王翔 发布于 2015-06-04 14:04, 949 次点击
我现在需要1000万至40亿个随机数,最好不重复,我尝试用向量的随机排序,可是 vs好像不支持,用随机数的话有不知以什么作为种子,求大神支招
11 回复
#2
诸葛欧阳2015-06-04 14:07
既然随机怎么保证不重复?
#3
rjsp2015-06-04 14:54
我现在需要1000万至40亿个随机数 ------ 到底要几个?并且数值范围是什么?
最好不重复 ------ 要还是不要?
我尝试用向量的随机排序 ------ 不知所云,我猜是 std::random_shuffle,但这又和“向量”有什么关系?向量是std::vector吗?别瞎翻译,而且与random_shuffle也无必然的关系。
可是 vs好像不支持 ------ 怎么个不支持法?是编译失败,还是编译时电脑爆炸?
用随机数的话有不知以什么作为种子 ------ 你想用什么就用什么。

http://en.
#4
yangfrancis2015-06-04 23:31
#include<time.h>
int main()
{
    system("pause");//或者出现其他等待的方式,如cin>>等,总之目的是不能让程序一开始就不停地运作
  srand(time(0));
    int x;
    x=(int)rand()%10000;//这就是0~10000的随机整数,取值范围根据自己的需要改,如果想得到几十亿个,用多重循环嵌套来反复提取吧。
}
//随机数一般都不要求不重复的,不知道你为什么会有这种要求。如果你实在不想让它重复,就把你生成的随机数做成链表,每生成一个新值的时候遍历整个链表看有无重复,重复的情况下重新取随机数。怕就怕long型的取值范围不够你开销,并且链表加长了之后运行速度是什么样就不好说了。
#5
诸葛欧阳2015-06-05 18:28
以下是引用yangfrancis在2015-6-4 23:31:22的发言:

#include<time.h>
int main()
{
    system("pause");//或者出现其他等待的方式,如cin>>等,总之目的是不能让程序一开始就不停地运作
  srand(time(0));
    int x;
    x=(int)rand()%10000;//这就是0~10000的随机整数,取值范围根据自己的需要改,如果想得到几十亿个,用多重循环嵌套来反复提取吧。
}
//随机数一般都不要求不重复的,不知道你为什么会有这种要求。如果你实在不想让它重复,就把你生成的随机数做成链表,每生成一个新值的时候遍历整个链表看有无重复,重复的情况下重新取随机数。怕就怕long型的取值范围不够你开销,并且链表加长了之后运行速度是什么样就不好说了。

这个是程序无法产生10000的,要想产生0~10000之间的数应该是x=(int)rand()%10001;
#6
诸葛欧阳2015-06-05 18:30
而且不可能不会重复的,当产生大量随机数时这些数据会出现均匀分布特征
#7
wmf20142015-06-05 20:28
40亿个?要用数组存储,把全部的内存都吃了,还要用到虚拟内存。理论上是可以产生不重复的,首先需要存储40亿个数的数组,第一次数组值就是其下标,由于c的随机数范围是0-32767,不足40亿,我们可以采取大范围洗牌模式,先1/2对差、再1/4、1/8、1/16、1/32,最后我们对对差完成的数组用随机数分段随机,则一个相对随机的40亿个随机系列就可以形成了,并且不重复。
#8
诸葛欧阳2015-06-05 22:28
回复 7楼 wmf2014
这个相当于随机排序了吧
#9
yangfrancis2015-06-05 22:44
回复 7楼 wmf2014
如果按照这种思路做的话,我觉得洗牌的过程可以干脆按下标依次遍历各个无素,将每个元素和数组内一个随机确定下标的元素互换。这样在代码理解上可能更可读一些。
#10
wmf20142015-06-05 23:00
回复 9楼 yangfrancis
你最多只能对32767个数进行随机,40亿个数不通过差动洗牌、分段随机会导致数据抱团,随机的不彻底。
#11
yangfrancis2015-06-06 12:03
回复 10楼 wmf2014
哦。I see
#12
ljh36752015-06-06 14:16
null
1