题目解析
- 首先需要将fx函数转化为一个0,1的等概率的心函数
- 对要转换的函数的范围分析
- 通过0,1等概率函数利用二进制规则转换为所需的函数
// 制作1-5上的随机函数
public static int fx() { return (int) (Math.random() * 5) + 1;
}
第一步:将fx函数转化为一个0,1的等概率的心函数
// 将fn转换为0,1等概率随机函数
public static int fn2() { int fn = fn(); while (fn == 2) { fn = fn(); } return fn < 3 ? 0 : 1;
}
第二步:对要转换的函数的范围分析
1~7等概率,观察我们制作随机函数,我们也可以先做一个0~6的等概率函数,然后再加一即可得到1~7的等概率函数
第三步:通过0,1等概率函数利用二进制规则转换为所需的函数
这里要做的内容就变为“如何通过等概率发射器生成二进制0~6等概率函数”。
二进制想要表达0~6之间的所有数最小需要四位。只需要连续roll4次等概率发射器即可生成从0~8的随机数,且每次得到的最终结果是等概率的。
但是我们不需要除了0~6以外的数值,所以如果大于6就再从头来一次,直到在范围以内在停止。
public static int fn3() { int a = 0; do { String result = ""; for (int i = 0; i < 4; i++) { result += fn2(); } a = Integer.parseInt(result, 2); }while (a > 6); return a + 1;
}