📜  使用给定的random0-1生成器实现random-0-6生成器

📅  最后修改于: 2021-04-24 14:50:06             🧑  作者: Mango

给定的函数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链接