LOADING

加载过慢请开启缓存 浏览器默认开启

用rand5()生成rand8()

2023/6/29 code

答案

: 5*rand5()+rand5().




有一个题目是用rand5()生成rand8()

已知rand5() 是等概率产生0,1,2,3,4

还没读rand的源码,先验证一下,

同时使用两次rand的情况下获取的数据确实不同:

@Test
public void getRand7(){
    Random rand = new Random();

    Integer[] arr = new Integer[10];
    Arrays.fill(arr, 0);
    for (int i = 0 ; i < 200 ; i++){
        arr[rand.nextInt(5)+rand.nextInt(5)]++;
    }
    System.out.println(Arrays.toString(arr));

}

rand5

既然如此 那么rand5等概率生成0,1,2,3,4
2*rand5 等概率生成0,2,4,6,8 以此类推

只需要把两个随机数相加能够生成覆盖0-7+区间即可

所以需要让rand5生成的数正好插入到n*rand5中

0 1 2 3 4 那么后面的数就是5

所以整体可以是

0,1,2,3, 4 ,
(5+0),(5+1),(5+2),(5+3),(5+4),
(10+0)(10+1) …

以此类推

总结
利用randN() 生成randAny()
答案
randN+N*randN (注意一定不可以整合)

生成的随机数为

1 , 2 , 3 , 4 … (n-1),
(n+0),(n+1),(n+2) … ,(2n-1) ,
(n+n)…..(Any - 1)