我正试图设计一个随机数生成器,它可以生成0-11之间的随机数。但我需要考虑到已经有一个可以生成0-5之间的随机数生成器。所有0-11之间的数字应该等概率地生成。
我查看了这个链接
在链接中使用的方程式为5*foo() + foo() -5
其中foo()
生成1-5之间的数字(而不是0-5)
1. For each value of first foo(), there can be 5 possible combinations for values of second foo(). So, there are total 25 combinations possible.
2. The range of values returned by the above equation is 1 to 25, each integer occurring exactly once.
3. If the value of the equation comes out to be less than 22, return modulo division by 7 followed by adding 1. Else, again call the method recursively. The probability of returning each integer thus becomes 1/7.
现在我能否在上文链接定义的函数中,将模数为12的函数改为模数为24并进行递归调用,如果数字超过24的话?如果不行,那么我就不明白问题出在哪里了。
或者,我找到了这个函数
我们将随机数生成函数称为f(6)
,它生成0-5之间的数字。
(f(6)+f(6)+f(6))%12;
如果不行的话,我能想到什么替代方案?我需要帮助完成这个任务。也许我漏掉了什么。关键在于0-11之间的每个数字都应该有相等的生成概率。除了 f(6)
,我不能使用其他函数,只能进行数学运算。
f(6)
,您就已经获得了36种可能的不同结果(方便地,36是12的倍数)。现在您只需要找到一种将这些不同的结果映射到您想要的方式。 - Mark Dickinsonf(6)*f(6)%12
应该可以完成任务了吗? - Nilesh(f(6)+1) * (f(6)+1)) % 12
这个建议显然不能给出均匀的分布(例如,数字7
就根本不会出现)。@DarioP 的第二个建议可以解决这个问题。 - Mark Dickinson