作者sjgau (sjgau)
看板C_and_CPP
标题Re: [问题] 消失的乱数
时间Fri Sep 25 10:28:44 2009
如果你 希望产生的乱数的变化越多越好,
而且保持均匀分布的乱数要求,
那麽,可以考虑
a= 7^5,
b= 0,
c= (2^31) - 1
那麽,产生的乱数范围是
1 - 2147483648
在产生 同一个乱数之前,
每一个 数字都会 出现一次
如果觉得这个乱数的周期不够长,
那麽可以考虑 double 的精确度是
52个 bits, 大约是 2^52
把 a, b, c扩大,测试找出一组 合适使用的
乱数产生的 常数,配合 ftime() 函数的 ms + time()
函数的 second, 把 (second % (10*86400))*1000 + ms 当作
乱数的 种子数。
这样子,应该够乱,也够长了。
good luck to you!
※ 引述《liwmewmew (如果大海能够)》之铭言:
: 小弟最近在研究乱数
: 想取[0, 1]之间的任一浮点数乱数 (包括0与1)
: 所以写出了 rand()/(float)RAND_MAX 这样的语法
: 结果发现,因为分母是奇数(32767),所以绝对取不到0.5这个乱数
: 所以试着把分母变为偶数 rand()/(float)(RAND_MAX+1)
: 但发现这样取不到1.0这个乱数
: 又如果改成 (rand()+1)/(float)(RAND_MAX+1)
: 那可以想像会取不到0.0这个乱数
: 如果我把分母乘两倍(一个偶数) rand()/(float)RAND_MAX*2
: 最後只要我敢把偶数乘数也乘到rand()上 ,那我的乱数就会分布不均的样子
: (rand()/(float)RAND_MAX*2)*2
: 不知道有没有大大有什麽建议的
: 真的非常谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.30.75.208
1F:推 stupidgod08:seed用这麽乱有差别吗 09/25 12:06
2F:推 LPH66:对某些需求可能会有... 09/25 12:16
3F:→ sjgau:a= 16807, b= 0, c= 2147483647, c is a prime number 09/25 12:30
4F:→ sjgau:有笔误,产生的乱数范围是:1 - 2147483646 09/25 12:31
5F:→ sjgau:使用 double 的话,周期长度可以到 4.5e15, 增加了 一百万倍 09/25 12:33
6F:推 stupidgod08:唔..光是time(NULL)的周期就够长了, 除了一秒内要做多 09/25 13:38
7F:→ stupidgod08:次srand以外, 我想不到其它理由要用这麽乱的seed 09/25 13:39
8F:→ MOONRAKER:"除了一秒内要做多次rand以外"?真是幽默! 09/25 14:08
9F:→ MOONRAKER:processor这麽快,你不想在一秒内连续取多次乱数都难! 09/25 14:09
10F:推 stupidgod08:我说srand.... 09/25 14:13
11F:推 MysterySW:这样不会有overflow的问题吗 09/25 15:44
12F:→ sjgau:改用 double, 使用 fmod() 取需要的 乱数范围,ex. 1 - 42 09/25 16:04