2017-06-02 95 views
1

抵达概率的近似值我给了一个关于概率的数学问题。它是这样的:使用代码

有1000个彩票,每个有1000张门票。您决定每次购买彩票1张。你至少赢得一个彩票的概率是多少?

我能够在数学上做到这一点(到达1 - (999/1000)^ 1000),但在我的计算机上发生了一个在我的计算机上进行大量随机实验迭代的想法。所以,我输入了一些代码 - 它的两个版本是确切的,并且都是故障。

代码1:

#include<iostream> 
#include <stdlib.h> 

using namespace std; 

int main() { 
    int p2 = 0; 
    int p1 = 0; 
    srand(time(NULL)); 
    for (int i = 0; i<100000; i++){ 
     for(int j = 0; j<1000; j++){ 
      int s = 0; 
      int x = rand()%1000; 
      int y = rand()%1000; 
      if(x == y) 
       s = 1; 
      p1 += s; 
     } 
     if(p1>0) 
      p2++; 
    } 
    cout<<"The final probability is = "<< (p2/100000); 
    return 0; 
} 

代码2:

#include<iostream> 

#include <stdlib.h> 

using namespace std; 

int main() { 
    int p2 = 0; 
    int p1 = 0; 
    for (int i = 0; i<100000; i++){ 
     for(int j = 0; j<1000; j++){ 
      int s = 0; 
      srand(time(NULL)); 
      int x = rand()%1000; 
      srand(time(NULL)); 
      int y = rand()%1000; 
      if(x == y) 
       s = 1; 
      p1 += s; 
     } 
     if(p1>0) 
      p2++; 
    } 
    cout<<"The final probability is = "<< (p2/100000); 
    return 0; 
} 

代码3(refered一些先进的文本,但我不明白大部分):

#include<iostream> 

#include <random> 

using namespace std; 

int main() { 
    int p2 = 0; 
    int p1 = 0; 
    random_device rd; 
    mt19937 gen(rd()); 
    for (int i = 0; i<100000; i++){ 
     for(int j = 0; j<1000; j++){ 
      uniform_int_distribution<> dis(1, 1000); 
      int s = 0; 
      int x = dis(gen); 
      int y = dis(gen); 
      if(x == y) 
       s = 1; 
      p1 += s; 
     } 
     if(p1>0) 
      p2++; 
    } 
    cout<<"The final probability is = "<< (p2/100000); 
    return 0; 
} 

现在,所有这些代码都输出相同的文本:

The final probability is = 1 
Process finished with exit code 0 

似乎rand()函数在循环的所有100000次迭代中都输出了相同的值。我无法解决这个问题。

我也尝试使用随机()函数,而不是函数srand()函数,但它似乎并没有工作,给奇怪的错误,如:

error: ‘randomize’ was not declared in this scope 
randomize(); 
     ^

我认为随机化()已停产在更高版本的C++中。

我知道我在很多层面上都是错的。如果您能耐心地向我解释我的错误,并让我知道一些可能的更正,我将非常感激。

回答

0

您应该在外循环开始时重置您的计数(p1)。此外,要知道最终整数p2/100000p2 < 100000任意值将导致0

看看你的代码的这个修改后的版本:

#include <iostream> 
#include <random> 

int main() 
{ 
    const int number_of_tests = 100000; 
    const int lotteries = 1000; 
    const int tickets_per_lottery = 1000; 

    std::random_device rd; 
    std::mt19937 gen(rd()); 
    std::uniform_int_distribution<> lottery(1, tickets_per_lottery); 

    int winning_cases = 0; 
    for (int i = 0; i < number_of_tests; ++i) 
    { 
     int wins = 0;       // <- reset when each test start 
     for(int j = 0; j < lotteries; ++j) 
     { 
      int my_ticket = lottery(gen); 
      int winner = lottery(gen); 
      if(my_ticket == winner) 
       ++wins; 
     } 
     if (wins > 0) 
      ++winning_cases; 
    } 
    // use the correct type to perform these calculations 
    double expected = 1.0 - std::pow((lotteries - 1.0)/lotteries, lotteries); 
    double probability = static_cast<double>(winning_cases)/number_of_tests; 

    std::cout << "Expected: " << expected 
       << "\nCalculated: " << probability << '\n'; 

    return 0; 
} 

一个tipical运行将输出的东西像:

 
Expected: 0.632305 
Calculated: 0.63125 
0

只在程序开始时按srand播种一次伪随机数发生器。当你一遍又一遍地播种时,将伪随机数发生器重置为相同的初始状态。默认情况下,time的粒度度量单位为秒。几率是你在一秒内完成1000次迭代 - 或者大部分迭代。

+0

我明白了,这就是我在第一个代码中尝试的。我如何避免在同一个循环中无法生成新的随机数的问题?对于x和y –