作者HuangJC (吹笛牧童)
看板ask-why
标题Re: [请益] 乱数表有没有规律??
时间Wed May 20 20:24:06 2009
: → littleshan:我是说,你提到「打字间隔集中在0.3~0.7秒」的问题 05/20 12:30
: → littleshan:只要用高精确度的 timer 就可以解决 05/20 12:31
: → littleshan:除非你的手能控制打字间隔落在 X.XX3 秒至 X.XX7 秒间 05/20 12:32
首先说,我看不懂前一篇的质数;我就是需要一个数学家来帮我
(这样我就不必多回一篇了)
再来我提一下我不懂的细节,而且我不认为够密就当然够均匀
举例来说,如果我有一个够均匀的乱数,十种变化
int r=random(); // 0~9
我要把它缩小到 9种变化
int R= (r/9.0)*8; // 0~8
这样,因为不是扩展,绝对不可能有变化太少的问题
但可能偏重於某几个变化
假设乱数函式并不乱,只是均匀,只是我做证明的工具
我当然可以给它一个伪函式,就简单递增,到最大值时绕卷为 0 好了
於是,r= 0,1,2,3,4,5,6,7,8,9 依序十次
而 R= 0,0,1,2,3,4,5,6,7,8 以无条件舍去来做浮点转换
反正就算你要四舍五入也会有一样的问题
好,以上 0 出现两次
乱数的均匀度要大量才能趋近,否则我只有9种值却要求做10次,当然不可能公平
那我们做90次好了 (9和10的公倍数;我隐隐闻到质数的道理,但又无法了解)
这90次里,我希望 r 均匀出现 0~9 九次
然後 R=f(r) 这个公式要改一下,就可以让 0~8 均匀出现十次
(九十次做完次数才对就好了;但简单的答案中,循环出现也是可以接受的
因为我不讨论有多乱,只先讨论均匀)
从这里可以看出,如果我只有简单的公式做 R=f(r)
那麽做十次,R=0 会重覆出现两次
做90次呢?它重覆出现 20次
而画成图会怎样?就是在 R=0 的位置比较粗,变一条直线
不均匀就是这样呀~
因为只有用简单的公式去把原始乱数扩展或缩小到我要的范围
原本的 0x00~0xFF 扩展成 0x0000~0xFFFF,我还算有直觉去解
然後我可以把 65536 的变化程度向内缩,去满足任何一种(小於65536)范围的乱数需求
但是这条不均匀惹出的直线,始终会非常明显
光要乱数是有啦
但好像尾牙抽奖,0号那位同仁每次都比别人多一个中奖机会
你说,这乱数公平吗?
或者我不要用乘法,用舍去法可以吗?
R=r,但当 r=9 时,重抽一次
这样我可不可以声明 R 的均匀度公平了?
只是有 1/10 的机率会使计算减慢(重抽一次)
当然,大部份时候,这样设计程式都叫想太多
我们很简单的把原始乱数除到变成 0~1 的浮点数再乘开就好了
没有人会知道其实他天生中奖率就比别人低了
只怪他命不好 :P
不好意思,也有黑心程式 XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.219.65.16
1F:推 sunev:把9丢掉就好啦? 05/20 21:20
如果可以,好像最省事 XD,但如果我要缩至 0~3..总之小心累死,不断重抽..
※ 编辑: HuangJC 来自: 61.219.65.16 (05/20 22:14)