随机函数rand1To7

简述

请用rand1To5实现等概率随机产生1~7的随机函数rand1To7

1
2
3
4
5
6
7
8
9
public class rand1to5 { 
/*
* 给定一个等概率随机产生1~5的随机函数rand1To5如下 public int rand1To5() { return (int)
* (Math.random() * 5) + 1; } 除此之外不能使用任何额外的随机机制,
* 请用rand1To5实现等概率随机产生1~7的随机函数rand1To7。
*/
public int rand1To5() {
return (int) (Math.random() * 5) + 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public int rand1To7() {
int num = 0;
do {
num = 5 * (rand1To5() - 1) + rand1To5() - 1;// 0-24
} while (num > 20); // 把21 22 23 24 的概率平摊到0-20上
return num % 7 + 1;
}
// 拓展: 1-m 等概率 转化成 等1-n概率 问题
// 实质就是看 把 m 看成m进制 n<m 则 m进制能装下n
// m>n 扩充成m^2 也就是增加一位 看能不能放下n 以此类推

// 给定一个以p概率产生0,以1-p概率产生1的随机函数rand01p如下:
// 除此之外不能使用任何额外的随机机制,请用rand01p实现等概率随机
// 产生1~6的随机函数rand1To6。
public int rand01p() {
// you can change p as you like
double p = 0.83;
return Math.random() < p ? 0 : 1;
}

public int rand01() {
int num = 0;
do {
num = rand01p();
} while (num == rand01()); // 01 和 10 产生的概率是相同的 把1看做01 0看做10
return num == 1 ? 1 : 0;
}

public int rand0To3() {
return rand01() * 2 + rand01();
}

public int rand1To6() {
int num = 0;
do {
num = rand0To3() * 4 + rand0To3();
} while (num > 11);
return num % 6 + 1;

}
// 其实就是一个扩大 补位 然后筛选的过程