2011-03-08 48 views
0

你介意幫助我解決以下問題嗎?謝謝。C++問題 - 任何人都可以幫忙嗎?

問: 滾動一氣呵成面6的3顆骰子的比例可以發現數學或 模擬。蒙特卡洛方法是一個計算機過程,通過計算機模擬找出問題的解決方案。編寫一個滾動三個骰子的程序,計算它們的總和,並找出滾動每個可能結果的概率。

給出一個骨架程序q1dskeleton.c,用於生成滾動一個 六面10000次骰子的統計信息。修改程序,以便它生成滾動三個六面骰子的總和的統計數據。程序輸出的例子在下面的 中給出。請注意,因爲骰子滾動的隨機性質。

提示:每擲出一個骰子,每個骰子擲一次rand()三次。

骨架:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

#define SIZE 7 

int main() { 

    int face, roll, frequency[SIZE] = { 0 }; 

    srand(time(NULL)); 

    for (roll = 1; roll <= 10000; roll++) { 
    face = rand() % 6 + 1; 
    ++frequency[face]; 
    } 
    printf("%s%12s\n", "Face", "Frequency"); 

    for (face = 1; face <= SIZE - 1; face++) 
    printf("%4d%12d\n", face, frequency[face]); 
    getchar(); 
} 

輸出:

Face Frequency 
3  49 
4  129 
5  276 
6  481 
7  669 
8  994 
9  1131 
10 1213 
11 1269 
12 1197 
13 962 
14 707 
15 464 
16 268 
17 144 
18 47 
+8

是你的代碼或你提供的問題?如果給出,你有嘗試過什麼嗎? – BoltClock 2011-03-08 07:50:08

+1

你只是期待人們免費做你的作業嗎? – 2011-03-08 07:51:29

+1

我認爲我們需要看到一些嘗試自己修改此代碼的嘗試。 – Elemental 2011-03-08 07:53:46

回答

2

另外,在計算rand()時,你需要認識到它並不是我們所希望的那樣隨機的。

從在文檔:http://www.cplusplus.com/reference/clibrary/cstdlib/rand/ 「注意,雖然這個模操作不會產生跨度真正的均勻分佈的隨機數(因爲在大多數情況下,數字出現了更多的可能),但它通常是一個很好的近似短跨度「。

因此,爲了獲得更好的結果,最好做一些工作,以獲得隨機結果的概率更高的蘭德範圍的不同公式。

例如,對於骰子,您可以得到30到90之間的隨機數,公式爲(int)(((float)result - 30)/ 10)+ 0.5或者沿着這些線。

然後,對於骰子2,你可以得到一個500到50000之間的數字,並製作另一個公式。

爲了讓你的家庭作業更有趣,你可以看看不同的網上賭場/撲克室如何做到這一點。 http://www.fulltiltpoker.com/random-number-generator

+0

非常感謝您的幫助。 – Terence 2011-03-08 08:34:56

3

很明顯,你必須增加SIZE,因爲不再有6級的可能性,但18 - 我會包括1:不可能總數和2在這裏,因爲你的原始解決方案包括不可能的零值:-)

然後,而不是擲一個骰子,你扔三個然後加起來的值。因此,像(僞代碼):

dice1 = first random number 
dice2 = second random number 
dice3 = third random number 
face = dice1 plus dice2 plus dice3 

此外是什麼,你再使用,以增加特定的數組元素。

對於獎勵積分,您應該避免打印不可能的結果。這是對您的最終for聲明的起始位進行的相當簡單的修改。


你所期望的比例,順便說一句,是{1, 3, 6, 10, 15, 21, 25, 27, 27, 25, 21, 15, 10, 6, 3, 1}那麼「理想」的輸出應該是相當接近的:

Face Frequency 
    3   46 
    4   138 
    5   277 
    6   462 
    7   694 
    8   972 
    9  1157 
    10  1250 
    11  1250 
    12  1157 
    13   972 
    14   694 
    15   462 
    16   277 
    17   138 
    18   46 

(即使只增加了到9992個樣本 - 這是一個關於其他八個地方出現的地方)。

+0

非常感謝你的幫助。 – Terence 2011-03-08 08:35:33

相關問題