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的分数。:-)