用偏硬币模拟抛硬币的程序
Posted
技术标签:
【中文标题】用偏硬币模拟抛硬币的程序【英文标题】:Program that simulates a coin toss with a bias coin 【发布时间】:2014-05-25 19:05:38 【问题描述】:我没有任何代码,主要是因为我还没有开始解决这个特定问题。这是我的 C 编程课的作业。
我的教授希望我们创建一个可以抛硬币(正面或反面)10,000 次的程序。但是,头部元素有 55% 的几率出现。我们必须使用具有用户提供的seed
值的随机数生成器。
从概念上讲,我知道如何处理这个问题;编码方面,我不知道。我知道如何制作抛硬币程序,但没有偏见。
我们将不胜感激。
我附上了我的投币机程序的代码。我原本打算以此为基础来制定这个新的bias抛硬币计划。
// CoinTosser_Homework4.cpp : Coin tossing program
// nxt3
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define HEADS 0
#define TAILS 1
int rand_int(int a, int b)
return rand() % ((b - a + 1) + a);
int main()
int tosses = 0, min = 0, heads = 0, tails = 0; //init tosses and number of user defined tosses
/*users input for number of tosses*/
printf("Enter number of coin tosses: ");
scanf("%i", &min);
while (tosses < min)
tosses++;
if (rand_int(HEADS, TAILS) == HEADS)
heads++;
else
tails++;
//prints results of tosses
printf("Number of heads: %i\n", heads);
printf("Number of tails: %i\n", tails);
return 0;
【问题讨论】:
生成一个介于 0..99 而不是 0..1 之间的随机数 显示主编码 oops 是rand() % ((b - a + 1) + a)
。认为你想要rand() % (b - a + 1) + a;
【参考方案1】:
用老式的方式做:
rand() % 100 + 1;
为您提供 1 到 100(含)范围内的数字。如果该数字小于或等于 55,则为正面。
但请注意,此生成器是有偏差的,除非生成器的周期性是 100 的倍数(可能不是)。你应该真正做的是使用类似的东西
(int)(100.0 * rand() / (RAND_MAX + 1.0)) + 1
100.0
也绕过整数除法。
【讨论】:
男人。我没想到。有点尴尬,我什至发布了这个,哈哈。我很感激。 :) 我认为您希望(int)(100.0 * rand() / (RAND_MAX + 1.0)) + 1
解决问题。否则代码可能会生成 101。
@chux: 好点:因为rand()
是必要的可以 画RAND_MAX
。我已经修改了。谢谢。
建议 RAND_MAX + 1.0
与 RAND_MAX + 1
。 RAND_MAX + 1
可能会溢出。
@chux:另一个好点。我没有解释就添加了 - 可能超出了问题范围。我们要共同发表吗?【参考方案2】:
我忘记了 C 的语法,但我可以为您提供 C++ 的解决方案。从这里你可以看到算法。
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;
int main()
int heads=0, tails=0;
srand(time(NULL));
number = rand() % 100 + 1; //Generate random number 1 to 100
if (number <= 55) //55% chance
heads++; //This is head
else
tails++; //This is tail
解释:由于使用通常的随机数会给你一个正态分布而不是泊松数分布,你可以安全地使用条件if (number <= 55)
来产生 55% 的概率。
【讨论】:
虽然我喜欢rand() % 100 + 1
的易处理性,但它会引入统计偏差,因为随机数生成器的周期性不是 100 的倍数。它可能足以解决这个问题,但它会在科学应用中受到冷落。以上是关于用偏硬币模拟抛硬币的程序的主要内容,如果未能解决你的问题,请参考以下文章