publicintrand1To7(){ 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。 publicintrand01p(){ // you can change p as you like double p = 0.83; return Math.random() < p ? 0 : 1; }
publicintrand01(){ int num = 0; do { num = rand01p(); } while (num == rand01()); // 01 和 10 产生的概率是相同的 把1看做01 0看做10 return num == 1 ? 1 : 0; }