概率p输出1,概率1-p输出0,等概率输出0和1

本文介绍了一种基于偏置随机数生成器创建等概率随机数的方法。通过两次调用输出0和1的偏置随机数函数,并根据结果的不同组合来确保最终输出1和0的概率均为1/2。
部署运行你感兴趣的模型镜像

有个输出0和1的BIASED RANDOM,它以概率p输出1,以概率1-p输出0,以此RANDOM函数为基础,生成另一个RANDOM函数,该函数以1/2的概率输出1,以1/2的概率输出0

题目解答:

两次调用该RANDOM函数,如果其概率为P(x),调用2次

P(1) = p       P(0) = 1-p

P'(1) =p      P'(0) = 1-p

概率如下:

11  p*p        10  p*(1-p)

01 (1-p)*p   00 (1-p)*(1-p)

int random_0_1()
{
	int i = RANDOM();
	int j = RANDOM();
	int result;

	while (true)
	{
		if (i == 0 && j == 1)
		{
			result = 0;
			break;
		}
		else if (i == 1 && j == 0)
		{
			result = 1;
			break;
		}
		else
			continue;
	}

	return result;
}


题目还可以引申:以1/N的概率返回1~N之间的数

等概率都出来了,random(1, N)还远吗?灭哈哈哈~~~


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们需要生成一个随机数,然后根据概率30%输出1,70%输出0。 我们可以使用`java.util.Random`类来生成一个[0,1)之间的随机浮点数,然后判断这个数是否小于0.3。如果是,则输出1;否则输出0。 因为00.3之间的概率是30%,而0.3到1.0之间的概率是70%。 步骤: 1. 创建Random对象。 2. 使用nextDouble()方法生成一个01之间的随机数。 3. 判断该随机数是否小于0.3,是则输出1,否则输出0。 注意:也可以使用nextInt(100)生成0到99的整数,然后判断是否小于30(因为30%)。 两种方法都可以,这里我们使用nextInt方法,因为整数运算更直观。 具体代码: 使用nextInt(100)生成0到99(包括099)的整数,然后判断这个整数是否小于30(即0到29,共30个数),如果是,则返回1,否则返回0。 代码示例: ```java import java.util.Random; public class ProbabilityExample { public static void main(String[] args) { Random rand = new Random(); int randomNum = rand.nextInt(100); // 生成0-99的整数 if (randomNum < 30) { System.out.println(1); } else { System.out.println(0); } } } ``` 或者,我们可以写一个函数来生成这个随机数: ```java import java.util.Random; public class RandomBinary { public static int generateBinary() { Random rand = new Random(); return rand.nextInt(100) < 30 ? 1 : 0; } public static void main(String[] args) { System.out.println(generateBinary()); } } ``` 这样,每次调用generateBinary()方法,就会按照30%的概率返回1,70%的概率返回0。 注意:使用Random类时,通常我们只需要一个Random实例,所以可以将其作为类的一个成员变量,避免重复创建。但在这个简单示例中,每次调用都创建一个新的Random实例在性能上不会有太大影响,不过对于频繁调用的情况,建议重用同一个Random实例。 改进版(重用Random实例): ```java import java.util.Random; public class RandomBinary { private static Random rand = new Random(); public static int generateBinary() { return rand.nextInt(100) < 30 ? 1 : 0; } public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(generateBinary()); } } } ``` 这样,我们创建了一个静态的Random实例,供多次调用使用。 以上代码可以满足需求。 相关问题: 1. 如何测试这个随机数生成器是否符合30%的概率? 2. 除了Random类,Java中还有哪些生成随机数的方法? 3. 如何生成一个概率可配置的随机二元生成器(比如40%输出1,60%输出0)?</think>以下是使用Java实现30%概率输出1、70%概率输出0的解决方案: ```java import java.util.Random; public class ProbabilityGenerator { public static void main(String[] args) { Random rand = new Random(); // 生成0-99的随机整数(共100种可能) int randomValue = rand.nextInt(100); // 判断:30%概率输出1,70%概率输出0 if (randomValue < 30) { // 0-29 (30个值) System.out.println(1); } else { // 30-99 (70个值) System.out.println(0); } } } ``` ### 代码说明: 1. **随机数生成**: - 使用`Random.nextInt(100)`生成0到99(包含0,不包含100)的整数 -100种等概率结果(每个概率1%) 2. **概率控制**: - `randomValue < 30`:覆盖30个值(0-29),对应30%概率 - `else`分支:覆盖剩余70个值(30-99),对应70%概率 3. **数学原理**: 设随机变量 $X$ 服从离散均匀分布: $$ X \sim \text{Uniform}\{0,1,2,\cdots,99\} $$ 输出函数为: $$ f(X) = \begin{cases} 1 & \text{if } X < 30 \\ 0 & \text{otherwise} \end{cases} $$ 满足 $P(f(X)=1) = \frac{30}{100} = 0.3$ ### 优化建议: 1. **重用Random实例**(避免频繁创建): ```java private static final Random RAND = new Random(); public static int generate() { return RAND.nextInt(100) < 30 ? 1 : 0; } ``` 2. **可配置概率**: ```java public static int generate(double probability) { return RAND.nextDouble() < probability ? 1 : 0; } // 调用:generate(0.3); ``` 3. **线程安全版**: ```java // 使用ThreadLocalRandom(Java 7+) import java.util.concurrent.ThreadLocalRandom; int value = ThreadLocalRandom.current().nextInt(100) < 30 ? 1 : 0; ``` ### 概率验证代码: 运行100万次测试概率分布: ```java public static void main(String[] args) { int count0 = 0, count1 = 0; int total = 1_000_000; for (int i = 0; i < total; i++) { if (generate() == 1) count1++; else count0++; } System.out.printf("0 出现比例: %.2f%%%n", (count0 * 100.0 / total)); System.out.printf("1 出现比例: %.2f%%%n", (count1 * 100.0 / total)); } // 典型输出: // 0 出现比例: 70.01% // 1 出现比例: 29.99% ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值