问题描述
给定一个随机数生成器rand7,它只能等概率生成0-6这7个整数。 请使用rand7制作一个生成器rand10,使其可以等概率返回0-9这10个整数。
解决办法
利用进制转换的方法。我们知道一个7进制数xy转换成10进制数的方法是每一位的数字乘以该位上的基,所以xy表示的十进制数是x * 71 + y * 70。如果x和y都是一个在0-6内的随机数,那么自然得到的十进制数也是在0-48之间的均匀随机数,得到任何一个数字的概率都是1/49。 我们在0-48之间只取0-39这40个随机数,当生成的数大于39时直接舍弃。显然得到的0-39这40个数中的任意一个仍然是等概率的,对其模10,即可得到0-9之间的均匀随机数,或者整除4也可。
实现
package com
.ftq
.demo
.leetcode
;
import java
.util
.Random
;
public class Rand7ToRand10 {
private Rand7 rand7
;
public Rand7ToRand10() {
rand7
= new Rand7();
}
public int rand10() {
int rand48
= rand7
.get() * 7 + rand7
.get();
while (rand48
>= 40) rand48
= rand7
.get() * 7 + rand7
.get();
return rand48
/ 4;
}
public static void main(String
[] args
) {
Rand7ToRand10 rand10
= new Rand7ToRand10();
int[] count
= new int[10];
int num
= 100000000;
for (int i
= 0; i
< num
; i
++) {
count
[rand10
.rand10()]++;
}
for (int ele
: count
) {
System
.out
.println(ele
/ (float) num
);
}
}
}
class Rand7 {
private Random rand7
;
public Rand7() {
rand7
= new Random();
}
public int get() {
return rand7
.nextInt(7);
}
}