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

我没有任何代码,主要是因为我还没有开始处理这个特定的问题。 这是我的C编程课的作业。

我的教授希望我们创建一个抛硬币(头或尾)10,000次的程序。 但是,磁头元件有55%的可能性发生。 我们必须使用具有用户提供的seed值的随机数生成器。

从概念上讲,我知道如何处理这个问题; 编码方面,我不知道。 我知道如何制作抛硬币计划,但不是偏见。

任何和所有的帮助将不胜感激。

我附上了我的硬币计划程序的代码。 我打算用这个作为这个新的偏向抛硬币计划的基础。

 // CoinTosser_Homework4.cpp : Coin tossing program // nxt3 #include "stdafx.h" #include  #include  #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; } 

这是老式的方式:

 rand() % 100 + 1; 

为您提供1到100(含)范围内的数字。 如果该数字小于或等于55,那就是头。

但请注意,除非生成器的周期是100的倍数(可能不是),否则此生成器是偏置的。 你真正应该做的是使用类似的东西

 (int)(100.0 * rand() / (RAND_MAX + 1.0)) + 1 

100.0也绕过了整数除法。

我忘记了C的语法,但我可以为您提供C ++的解决方案。 从这里你可以看到算法。

 #include  #include  #include  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%的概率。