作者sjgau (sjgau)
看板C_and_CPP
标题Re: [问题] 消失的乱数
时间Thu Sep 24 14:43:40 2009
※ 引述《liwmewmew (如果大海能够)》之铭言:
: 小弟最近在研究乱数
好好研究吧!乱数的用处 非常大。
: 想取[0, 1]之间的任一浮点数乱数 (包括0与1)
不合理!我看到的书,都说 >= 0.0, < 1.0
: 所以写出了 rand()/(float)RAND_MAX 这样的语法
: 结果发现,因为分母是奇数(32767),所以绝对取不到0.5这个乱数
这个 不稀奇,对於浮点数来说,电脑所能够表示的 浮点数
是 离散的,是 不连续的。
很多数都 无法精确表示。
少一个 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
: 不知道有没有大大有什麽建议的
: 真的非常谢谢
你可以 试着自己写
R(n)= (R(n-1)*a + b)%c
a, b, c 的变化和 排列组合很多,
例如
a= 7^5, b= 0, c= (2^31) - 1
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.245.110.241
1F:推 liwmewmew:谢谢大大 我刚也发现到这样除也只有32767种变化 09/24 14:49
2F:→ liwmewmew:本来就有很多浮点数会消失了,只是刚好在0.5让我注意到 09/24 14:50
3F:推 ckclark:#16hVIzB8 讨论串可以看看(那篇标题下得不好) 09/24 14:50