关于随机数的问题(生产1亿个不重复的数)

billowsky 2009-01-12 02:04:57
因为rand函数产生的随机数 范围是0 to RAND_MAX (32767). 所以当需要的随机数 个数大于32767时,必然会出现重复的随机数,


怎么样才能生成1亿不重复的随机数呢?
...全文
593 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
icerlion 2010-01-10
  • 打赏
  • 举报
回复
可否分而制之?

将整体范围分割,
对半分吧,
缩小求解范围。
最终达到一个足够小的定义域来求解。
sincor 2009-01-31
  • 打赏
  • 举报
回复
这个想法金典 建立个数组 每次都乱放进去 显示出来就是随机数了 哈哈[Quote=引用 6 楼 jennyvenus 的回复:]
1-1亿打乱就是随机数了。
[/Quote]
kienowl 2009-01-31
  • 打赏
  • 举报
回复
回是个美德
yulihua49 2009-01-31
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 findcaiyzh 的回复:]
net framework中的Random可以产生Int类型的随机数

Random.Next Method
Returns a nonnegative random number.
A 32-bit signed integer greater than or equal to zero and less than MaxValue.

应该就是2147483647,够lz用了,但是怎么唯一是个问题。
要是我的话,就把随机数定义成一个long类型64位,分成两个部分,一部分随机生成,另一个部分序列生成.

long rad = random.Next() < < 32 + 1;
...
long …
[/Quote]
没有RSA方法随机性好。
宝_爸 2009-01-29
  • 打赏
  • 举报
回复
net framework中的Random可以产生Int类型的随机数

Random.Next Method
Returns a nonnegative random number.
A 32-bit signed integer greater than or equal to zero and less than MaxValue.

应该就是2147483647,够lz用了,但是怎么唯一是个问题。
要是我的话,就把随机数定义成一个long类型64位,分成两个部分,一部分随机生成,另一个部分序列生成.

long rad = random.Next() << 32 + 1;
...
long rad = random.Next() << 32 + n;
这样来保证不重复。


yulihua49 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yulihua49 的回复:]
引用 18 楼 yulihua49 的回复:
引用楼主 billowsky 的帖子:
因为rand函数产生的随机数 范围是0 to RAND_MAX (32767). 所以当需要的随机数 个数大于32767时,必然会出现重复的随机数,


怎么样才能生成1亿不重复的随机数呢?

可以采用32bit RSA算法,这样小的数,对于PKI没什么用(可以作为教学演示用),但对你这个课题,恰好有用。

设A从2~(N-1)
C=(A EXP D) mod N
满足如下条件:
D是素数,N是两个…
[/Quote]
如果我们做一个扑克牌的洗牌算法,可以用N=(19×3)=57,我们就有了55个点。
可以选D=7。
for A=2 to 56
C=(A exp 7) mod 57
yulihua49 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yulihua49 的回复:]
引用楼主 billowsky 的帖子:
因为rand函数产生的随机数 范围是0 to RAND_MAX (32767). 所以当需要的随机数 个数大于32767时,必然会出现重复的随机数,


怎么样才能生成1亿不重复的随机数呢?

可以采用32bit RSA算法,这样小的数,对于PKI没什么用(可以作为教学演示用),但对你这个课题,恰好有用。
[/Quote]
设A从2~(N-1)
C=(A EXP D) mod N
满足如下条件:
D是素数,N是两个素数(P,Q)之积,
(D * E) mod ((P-1) * (Q-1))=1
因为:若
C=(A EXP D)mod N
有:
A=(C EXP E) mod N
所以,C与A 一一对应。
所以,对于A=2~(N-1),有不重复,无遗漏的伪随机码。
yulihua49 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 billowsky 的帖子:]
因为rand函数产生的随机数 范围是0 to RAND_MAX (32767). 所以当需要的随机数 个数大于32767时,必然会出现重复的随机数,


怎么样才能生成1亿不重复的随机数呢?
[/Quote]
可以采用32bit RSA算法,这样小的数,对于PKI没什么用(可以作为教学演示用),但对你这个课题,恰好有用。
hityct1 2009-01-25
  • 打赏
  • 举报
回复
可以考虑使用标准c++库中的random_shuffle


#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}

// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;

int main () {
srand ( unsigned ( time (NULL) ) );
vector<int> myvector;
vector<int>::iterator it;

// set some values:
for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

// using built-in random generator:
random_shuffle ( myvector.begin(), myvector.end() );

// using myrandom:
random_shuffle ( myvector.begin(), myvector.end(), p_myrandom);

// print out content:
cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;

cout << endl;

return 0;
}



可能的输出:
myvector contains: 3 4 1 6 8 9 2 7 5
alan001 2009-01-22
  • 打赏
  • 举报
回复
可能要用到两个以上的随机池了
alan001 2009-01-22
  • 打赏
  • 举报
回复
int i = rand();
int j = rand();
int myrandnum =(i<<16)|j
gzdiablo 2009-01-22
  • 打赏
  • 举报
回复
1亿个光生成用了4分钟 好慢...
gzdiablo 2009-01-22
  • 打赏
  • 举报
回复
一个超慢的方法.

自己写个int的Comparison(比较)函数
总之在Comparsion返回的值,跟参数无关单纯返回-1 0 1三种情况就行了。
然后生成一个1~1亿的数组,保证值不要重复,可以是顺序的。
然后用这个乱序的比较函数去排序数组 就可以生成随机不重复的数组了。

注意此方法速度很慢 我生成100W数据时用了1.5秒 生成1000W数据时用了17秒。
1亿的话 不敢试

例如:


//随机数
private Random ra = new Random(DateTime.Now.Millisecond);
//数组
private int[] arr = new int[100000000];
//缓存记录数组最后一位的下标
private int arrLength = 0;
//比较函数 用于生成随机顺序
private int compare(int x, int y)
{
int r = ra.Next(3) - 1;
if (x == arr[arrLength] || y == arr[0])r++;
return r;
}
//生成数组
private void CreateArray()
{
arrLength = arr.Length - 1;
for (int i = 0, l = arr.Length; i < l; i++)
arr[i] = i;
Array.Sort<int>(arr, new Comparison<int>(compare));
}



冰霜icefrost 2009-01-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 billowsky 的帖子:]
因为rand函数产生的随机数 范围是0 to RAND_MAX (32767). 所以当需要的随机数 个数大于32767时,必然会出现重复的随机数,


怎么样才能生成1亿不重复的随机数呢?
[/Quote]

范围如果限定到32767,那样的话,无论怎么做都有重复的。
only_lonely 2009-01-22
  • 打赏
  • 举报
回复
很麻烦的一个问题····
Yao_2002 2009-01-22
  • 打赏
  • 举报
回复
UP
pphero2777 2009-01-18
  • 打赏
  • 举报
回复
up
pphero2777 2009-01-18
  • 打赏
  • 举报
回复
up
coldant 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hityct1 的回复:]
引用 2 楼 davysnet 的回复:
0到32767总共才32768个数,怎么可能会产生1亿个不重复的数呢,总数都没那么多。

一般想要不重复,都是建一个集合,把产生的数放进去,每产生一个,跟集合内的判断是否存在,如果存在就重新取。但你这个集合似乎有点大,会影响执行效率


up
[/Quote]

UP
用户 昵称 2009-01-16
  • 打赏
  • 举报
回复
1-1亿打乱就是随机数了。
加载更多回复(5)

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧