用偏硬币模拟抛硬币的程序

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.0RAND_MAX + 1RAND_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 &lt;= 55) 来产生 55% 的概率。

【讨论】:

虽然我喜欢 rand() % 100 + 1 的易处理性,但它会引入统计偏差,因为随机数生成器的周期性不是 100 的倍数。它可能足以解决这个问题,但它会在科学应用中受到冷落。

以上是关于用偏硬币模拟抛硬币的程序的主要内容,如果未能解决你的问题,请参考以下文章

python实现简单随机模拟——抛呀抛硬币

用随机数列模拟抛硬币

HZOI20190908模拟40 队长快跑,影魔,抛硬币 题解

编写一个程序,模拟扔硬币的结果

概率论与数理统计python实验

如何模拟有偏硬币的翻转?