给定的函数random01Generator(),让你随机0或1,实现了利用该函数的函数,并且0和6(包括两个端值)之间产生的数字。所有数字都应具有相同的出现概率。
例子:
on multiple runs, it gives
3
2
3
6
0
方法:这里的想法是找到大于给定范围的最小数字范围。在这里,由于范围是6,所以2 ^ 3是大于6的最小数。因此,这里的k将是3。
因此,尝试每次形成一个由3个字符组成的二进制数,并在获得所有3个字符,查找该二进制数的相应十进制表示形式并返回该值。
例如,如果它在第一个random01调用中给出0,然后在下一个调用中给出1,最后在下一个调用中再次给出1,则可以说这样形成的二进制数是011,它是数字3的十进制表示,因此返回3。如果它给出111,这是超出范围的7。因此,只需丢弃该数字,然后再次重复整个过程,直到给出的数字在所需范围内即可。
调用random01Generator()6次后,出现数字的概率将不同。例如,对于第一次,出现0的概率为1/2。现在,第二次概率再次为1/2,这使得总概率为1/4。如果通过调用随机函数6次来将该过程重复6次,则将出现0的概率定为1 /(2 ^ 6)。类似地,遵循二项分布模式,出现1的概率将大于0,出现2的概率将大于1,依此类推。
以上述方式进行操作将确保所有概率都是相等的,因为它仅考虑可以生成这些数字的范围,并且拒绝任何给定结果大于最大指定范围的情况。因此,上述方法。
显然,如果存在其他随机生成器(例如random0mGenerator()),并且需要生成介于0到n之间的数字(其中n> m),则可以扩展这种想法。在这种情况下,请修改以下函数以合并m和n。
先决条件: Java的BigInteger。
Java
// Java code to generate random numbers
import java.math.BigInteger;
import java.util.Random;
public class RandomImp{
public int random01Generator() {
Random rand = new Random();
return rand.nextInt(2);
}
// function will use the above
// method and return numbers
// between 0 and 6 inclusive.
public void random06Generator(){
Random rand = new Random();
int val = 7;
while (val >= 7) {
String res = "";
for (int i = 0; i < 3; i++)
res +=
String.valueOf(random01Generator());
BigInteger bg = new BigInteger(res,2);
val = bg.intValue();
}
System.out.println(val);
}
// Driver Code
public static void main(String[] args){
RandomImp r = new RandomImp();
r.random06Generator();
}
}
输出 :
3
2
4
1
这个问题的灵感来自这个stackoverflow链接