不均匀硬币模拟均匀硬币
2026/4/30 20:25:08 网站建设 项目流程

题目要求:有一个rand函数,生成1的概率是p,0的概率是1 - p,那么如何用它生成一个rand2(),使得生成1和0的概率都是0.5。本质上是用不均匀硬币模拟均匀硬币。

1.思路:连续抛两次不均匀硬币,结果有四种可能,分别是01,10,00,11。其中01和10的概率相等。

P(01) = (1 - p) * p

P(10) = p * (1 - p)

所以,可以遇到01就输出0,遇到10就输出1,遇到00或11就重新抛。

2.算法步骤:

(1)调用两次rand(),生成随机的(a,b)。

(2)如果a == 1 && b == 0,就返回1。

(3)如果a == 0 && b == 1,就返回0。

(4)否则重复步骤(1)。

附代码:

class Solution { // 已知的不均匀随机函数(模拟题目中的 rand) // 成员变量,每次调用rand()时用到的p值 private double p; // 构造方法 // 通过构造方法把外部传入的p存到成员变量里,确保rand()能拿到p值 public Solution(double p) { this.p = p; } // 模拟题目给的 rand() private int rand() { // 生成一个[0.0,1.0)之间的随机小数 // 如果这个生成的小数 < p就返回1,否则返回0 return Math.random() < p ? 1 : 0; } // 用 rand() 生成均匀的 rand2() public int rand2() { while (true) { int a = rand(); int b = rand(); if (a == 1 && b == 0) return 1; if (a == 0 && b == 1) return 0; // 否则重新抛 } } }

ACM模式:

import java.util.Scanner; class Solution { // 已知的不均匀随机函数(模拟题目中的 rand) // 成员变量,每次调用rand()时用到的p值 private double p; // 构造方法 // 通过构造方法把外部传入的p存到成员变量里,确保rand()能拿到p值 public Solution(double p) { this.p = p; } // 模拟题目给的 rand() private int rand() { // 生成一个[0.0,1.0)之间的随机小数 // 如果这个生成的小数 < p就返回1,否则返回0 return Math.random() < p ? 1 : 0; } // 用 rand() 生成均匀的 rand2() public int rand2() { while (true) { int a = rand(); int b = rand(); if (a == 1 && b == 0) return 1; if (a == 0 && b == 1) return 0; // 否则重新抛 } } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入 p 值(0 < p < 1 且 p ≠ 0.5) double p = scanner.nextDouble(); // 需要生成的随机数个数 int n = scanner.nextInt(); Solution solution = new Solution(p); for (int i = 0; i < n; i++) { System.out.print(solution.rand2()); if(i < n - 1){ System.out.print(" "); } } System.out.println(); scanner.close(); } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询