答案
: 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等概率生成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)