设计一个随机数生成器

6

我正试图设计一个随机数生成器,它可以生成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),我不能使用其他函数,只能进行数学运算。


欢迎来到SO:SE。请阅读[提问指南]。您的帖子应该在两个方向上进行改进:在帖子中包含链接资源的相关部分(以防资源被移动或删除),并提供您当前尝试的代码。祝你好运! - mins
你所做的听起来很合理,但我会把它留给能够“证明”的人。我已经生疏了,而且我学习这方面的课程已经有一段时间了。 - Benjamin Gruenbaum
1
@Ayush:接近了,但还不够。请注意,只需两次调用f(6),您就已经获得了36种可能的不同结果(方便地,36是12的倍数)。现在您只需要找到一种将这些不同的结果映射到您想要的方式。 - Mark Dickinson
哦,那么 f(6)*f(6)%12 应该可以完成任务了吗? - Nilesh
@Ayush: (f(6)+1) * (f(6)+1)) % 12 这个建议显然不能给出均匀的分布(例如,数字 7 就根本不会出现)。@DarioP 的第二个建议可以解决这个问题。 - Mark Dickinson
显示剩余4条评论
2个回答

4

有许多方法可以做到这一点,但在这种情况下,我会选择:

f(6) + 6*f(2)

在哪里

f(2) = f(6)%2

概率是均匀的,因为你从0到5中获得数字的概率是均匀的,将它移动到6-11区间的概率也是均匀的。


1

假设你有一个生成0到5之间数字的函数g6()。如果计算(6 * g6()) + g6(),将得到一个均匀分布的0到35之间的数字。现在只需将其除以3即可获得均匀分布的0到11之间的数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接