我正在写一个蒙特卡罗模拟和我将需要大量的随机位的生成均匀分布在{1,2,...,N},其中N <40的整数。 与使用C的问题rand
功能是我使用标准浪费了很多非常好的位rand % N
技术。 什么是用于生成整数更好的办法?
我不需要加密安全随机数字,但我不想让他们歪曲我的结果。 另外,我不认为从random.org溶液中下载批次位。
我正在写一个蒙特卡罗模拟和我将需要大量的随机位的生成均匀分布在{1,2,...,N},其中N <40的整数。 与使用C的问题rand
功能是我使用标准浪费了很多非常好的位rand % N
技术。 什么是用于生成整数更好的办法?
我不需要加密安全随机数字,但我不想让他们歪曲我的结果。 另外,我不认为从random.org溶液中下载批次位。
rand % N
不起作用; 它歪斜的结果,除非RAND_MAX + 1
是的倍数N
。
正确的做法是要弄清楚的最大倍数N
这是小于RAND_MAX
,然后产生随机数,直到它低于该值。 只有这样,你应该做的模运算。 这给你50%的最坏情况下的抑制比。
除了公开进修学院的回答是:
如果你迫切关心位,然后你可以手工管理位的队列,只需要在接下来的数(即上(LOG 2(N)))获取尽可能多的。
但是你要确保你的发电机是不够好。 简单的线性同余(SP?)发电机在高位优于低(见注释),所以你当前的模块划分方法更有意义存在。
数字食谱有这一切一个很好的部分,很容易阅读(不知道它提到节省位,但作为一般REF)。
更新如果您不确定是否它需要或不,我不会担心这个,现在(除非你有从别人谁了解你的特定情况下更好的建议)。
代表rand
在base40,走位数字。 删除任何不完整的数字,也就是说,删除第一个数字,如果它不具有完整的范围[0..39]和删除整个随机数,如果第一个数字取其最高可能值(例如,如果RAND_MAX是base40是21 23 05 06,滴具有最高基-40位21的所有数值)。