我可以使用哪种方法最小化生成从0到9的均匀分布数字所需的硬币翻转量?
我做了一些研究,但我无法弄清楚如何使其适应这个特定的问题:
答案 0 :(得分:2)
在翻转硬币时,您需要至少10种可能的组合。如果硬币被翻转4次,我们将有16个排列。因此,所需的最小翻转次数为4。
通过参考reference中提到的算法,我们可以按如下方式实现该问题。
变量randNum
返回0-9之间均匀分布的随机数。
函数rand2
通过为T和H分配0和1值来模拟硬币翻转练习,反之亦然。
int[][][][] fourDimArr = { { { {1, 2},{3, 4} }, {{5, 6} ,{7, 8} } }, { { {9,10},{0,0} }, { {0,0},{0,0} } } };
int result = 0;
while (result == 0)
{
int i = rand2();
int j = rand2();
int k = rand2();
int l = rand2();
result = fourDimArr[i][j][k][l];
}
int randNum = result-1;
James K Polk在下面的评论中提出了一种更简单,更直观的实施方案。它涉及使用硬币翻转的结果作为四位数的位。
通过拒绝值> = 10,我们将生成0-9之间的均匀分布的随机数。有关实现,请参阅下面的代码段。
int result = 11;
while(result>=10){
result = 0;
for(int j = 0; j < 4; j++){
result = (result<<1)|rand2();
}
}
randNum = result;
rand2的示例实现如下:
private static int rand2() {
if(Math.random()>0.5)return 1;
return 0;
}
注意:所需的最小翻转次数为4.在最坏情况下所需的翻转次数仍然是无限的,但这种情况永远不会出现。