Algorithm 为什么不使用1-5中的随机数组合生成一个随机数1-7呢?

Algorithm 为什么不使用1-5中的随机数组合生成一个随机数1-7呢?,algorithm,math,random,Algorithm,Math,Random,假设我们有一个随机生成器函数rand5,它生成一个介于1和5之间的随机数,包括1和5。我已经看到,如果你想用它来生成一个介于1和7之间的随机数,你应该重复计算 (5 * (rand5() - 1) + rand5()) 要生成一个介于1和30之间(含1和30)的随机数,请重复此过程,直到生成一个介于1和21之间的数字,然后取结果mod seven 为什么不直接用这个公式计算1到7之间的随机数呢 (rand5() + rand5() + rand5()) % 7 + 1 这里有一个更简单、相关

假设我们有一个随机生成器函数
rand5
,它生成一个介于1和5之间的随机数,包括1和5。我已经看到,如果你想用它来生成一个介于1和7之间的随机数,你应该重复计算

(5 * (rand5() - 1) + rand5())
要生成一个介于1和30之间(含1和30)的随机数,请重复此过程,直到生成一个介于1和21之间的数字,然后取结果mod seven

为什么不直接用这个公式计算1到7之间的随机数呢

(rand5() + rand5() + rand5()) % 7 + 1

这里有一个更简单、相关的问题。假设您想要生成一个介于1和8之间(包括1和8)的数字,并且您有一对六面骰子。如果您尝试通过滚动一对骰子生成这样一个随机数,将结果改为8,然后添加1,会发生什么?也就是说,如果你像下面这样做会发生什么

int value = (rand6() + rand6()) % 8 + 1;
这将在正确的范围内生成一个随机数,但不会统一生成它们。具体来说,在掷骰子时得到不同总数的概率并不一致:

 2:   1 / 36
 3:   2 / 36
 4:   3 / 36
 5:   4 / 36
 6:   5 / 36
 7:   6 / 36
 8:   5 / 36
 9:   4 / 36
10:   3 / 36
11:   2 / 36
12:   1 / 36
取这些数字,将它们改为8,再加上1,然后将它们组合在一起,得到生成1到8之间每个数字的概率如下:

 1:   5 / 36  (have to roll 8)
 2:   4 / 36  (have to roll 9)
 3:   4 / 36  (have to roll 2 or 10)
 4:   4 / 36  (have to roll 3 or 11)
 5:   4 / 36  (have to roll 4 or 12)
 6:   4 / 36  (have to roll 5)
 7:   5 / 36  (have to roll 6)
 8:   6 / 36  (have to roll 7)
注意,这些概率并不一致;你更有可能得到1分、7分或8分

这个例子并不完全是你想要的,但它是相同的想法。将多个均匀随机值相加并不能在其总和的范围内得到均匀分布,因此,如果您从这种非均匀分布开始,并使用mods尝试将其压缩到较小的范围内,您将得到该范围内的分布,但不一定是均匀分布


更复杂的公式——顺便说一句,这是一种拒绝抽样——在一定范围内(1-30)生成一个均匀随机数,重复这个过程,直到得到1-21之间的某个值。然后,在该范围内产生的值被保证是一致随机的,因为21是7的倍数,所以按7修改可以保证1-7之间的一致随机值。

这里有一个更简单的相关问题。假设您想要生成一个介于1和8之间(包括1和8)的数字,并且您有一对六面骰子。如果您尝试通过滚动一对骰子生成这样一个随机数,将结果改为8,然后添加1,会发生什么?也就是说,如果你像下面这样做会发生什么

int value = (rand6() + rand6()) % 8 + 1;
这将在正确的范围内生成一个随机数,但不会统一生成它们。具体来说,在掷骰子时得到不同总数的概率并不一致:

 2:   1 / 36
 3:   2 / 36
 4:   3 / 36
 5:   4 / 36
 6:   5 / 36
 7:   6 / 36
 8:   5 / 36
 9:   4 / 36
10:   3 / 36
11:   2 / 36
12:   1 / 36
取这些数字,将它们改为8,再加上1,然后将它们组合在一起,得到生成1到8之间每个数字的概率如下:

 1:   5 / 36  (have to roll 8)
 2:   4 / 36  (have to roll 9)
 3:   4 / 36  (have to roll 2 or 10)
 4:   4 / 36  (have to roll 3 or 11)
 5:   4 / 36  (have to roll 4 or 12)
 6:   4 / 36  (have to roll 5)
 7:   5 / 36  (have to roll 6)
 8:   6 / 36  (have to roll 7)
注意,这些概率并不一致;你更有可能得到1分、7分或8分

这个例子并不完全是你想要的,但它是相同的想法。将多个均匀随机值相加并不能在其总和的范围内得到均匀分布,因此,如果您从这种非均匀分布开始,并使用mods尝试将其压缩到较小的范围内,您将得到该范围内的分布,但不一定是均匀分布


更复杂的公式——顺便说一句,这是一种拒绝抽样——在一定范围内(1-30)生成一个均匀随机数,重复这个过程,直到得到1-21之间的某个值。然后,在该范围内生成的值保证是一致随机的,因为21是7的倍数,所以按7修改保证了1-7之间的一致随机值。

因为
rand5()+rand5()-3
可以给出-1?使用表达式计算每个数字的次数(将每个值替换为1-5将得到5*5*5=125个表达式进行计算)。您甚至可以编写一个三重for循环来完成此操作。这应该可以很好地解释发生了什么。@user3833308那么
5*rand5()+rand5())-1
如何生成1,2,3,4?您真的应该在问题中从头开始解释这个问题。这对于不熟悉它的人来说是相当神秘的。你也可以在掷2个骰子时搜索得到不同结果的概率-这是为什么添加均匀分布不会导致均匀分布的一个相当常见的例子。因为
rand5()+rand5()-3
可以给出-1吗?计算使用表达式得到每个数字的次数(用1-5替换每个值可以得到5*5*5=125个表达式进行计算)。您甚至可以编写一个三重for循环来为您执行此操作。这应该可以很好地解释发生了什么。@user3833308那么
5*rand5()+rand5())-1如何构成1,2,3,4?你真的应该在问题中从头开始解释这个问题。这对于不熟悉它的人来说是相当神秘的。你也可以搜索在掷2个骰子时得到不同结果的概率-这是为什么添加均匀分布不会导致均匀分布的一个相当常见的例子。你的第一个代码块中的
x/36
代表什么?@user3833308分数x超过36.:-)第一个代码块中的
x/36
代表什么?@user3833308 x除以36的分数。:-)