2017-06-02 96 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 –