| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 949 人关注过本帖
标题:生产大量无序随机数
只看楼主 加入收藏
王翔
Rank: 2
等 级:论坛游民
帖 子:13
专家分:12
注 册:2015-2-1
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:11 
生产大量无序随机数
我现在需要1000万至40亿个随机数,最好不重复,我尝试用向量的随机排序,可是 vs好像不支持,用随机数的话有不知以什么作为种子,求大神支招
搜索更多相关主题的帖子: 最好 
2015-06-04 14:04
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:2 
既然随机怎么保证不重复?

一片落叶掉进了回忆的流年。
2015-06-04 14:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:2 
我现在需要1000万至40亿个随机数 ------ 到底要几个?并且数值范围是什么?
最好不重复 ------ 要还是不要?
我尝试用向量的随机排序 ------ 不知所云,我猜是 std::random_shuffle,但这又和“向量”有什么关系?向量是std::vector吗?别瞎翻译,而且与random_shuffle也无必然的关系。
可是 vs好像不支持 ------ 怎么个不支持法?是编译失败,还是编译时电脑爆炸?
用随机数的话有不知以什么作为种子 ------ 你想用什么就用什么。

http://en.
2015-06-04 14:54
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:2 
#include<time.h>
int main()
{
    system("pause");//或者出现其他等待的方式,如cin>>等,总之目的是不能让程序一开始就不停地运作
  srand(time(0));
    int x;
    x=(int)rand()%10000;//这就是0~10000的随机整数,取值范围根据自己的需要改,如果想得到几十亿个,用多重循环嵌套来反复提取吧。
}
//随机数一般都不要求不重复的,不知道你为什么会有这种要求。如果你实在不想让它重复,就把你生成的随机数做成链表,每生成一个新值的时候遍历整个链表看有无重复,重复的情况下重新取随机数。怕就怕long型的取值范围不够你开销,并且链表加长了之后运行速度是什么样就不好说了。
2015-06-04 23:31
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
以下是引用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;

一片落叶掉进了回忆的流年。
2015-06-05 18:28
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
而且不可能不会重复的,当产生大量随机数时这些数据会出现均匀分布特征

一片落叶掉进了回忆的流年。
2015-06-05 18:30
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:2 
40亿个?要用数组存储,把全部的内存都吃了,还要用到虚拟内存。理论上是可以产生不重复的,首先需要存储40亿个数的数组,第一次数组值就是其下标,由于c的随机数范围是0-32767,不足40亿,我们可以采取大范围洗牌模式,先1/2对差、再1/4、1/8、1/16、1/32,最后我们对对差完成的数组用随机数分段随机,则一个相对随机的40亿个随机系列就可以形成了,并且不重复。

能编个毛线衣吗?
2015-06-05 20:28
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
回复 7楼 wmf2014
这个相当于随机排序了吧

一片落叶掉进了回忆的流年。
2015-06-05 22:28
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 7楼 wmf2014
如果按照这种思路做的话,我觉得洗牌的过程可以干脆按下标依次遍历各个无素,将每个元素和数组内一个随机确定下标的元素互换。这样在代码理解上可能更可读一些。
2015-06-05 22:44
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 9楼 yangfrancis
你最多只能对32767个数进行随机,40亿个数不通过差动洗牌、分段随机会导致数据抱团,随机的不彻底。

能编个毛线衣吗?
2015-06-05 23:00
快速回复:生产大量无序随机数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034465 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved