none
使用 xx.next(2,12)產生的問題 RRS feed

  • 問題

  • 這是題目:使用亂數模擬「擲兩顆骰子」1000次,請列出出現2~12點的次數與機率,如果擲10000次真的會比較接近正確的機率嗎?                                                                                               

    int[] count = new int[10000];
                double[] count2= {0,0,0,0,0,0,0,0,0,0,0};


                Random num=new Random();
                for (int i = 0; i < 10000; i++)
                {
                    count[i]=num.Next(2,13);
                    switch(count[i]%12)
                    {
                        case 0:
                            count2[10] +=1;
                            break;
                        case 2:
                            count2[0] +=1;
                            break;
                        case 3:
                            count2[1] +=1;
                            break;
                        case 4:
                            count2[2] +=1;
                            break;
                        case 5:
                            count2[3] +=1;
                            break;
                        case 6:
                            count[4] +=1;
                            break;
                        case 7:
                            count[5] +=1;
                            break;
                        case 8:
                            count2[6] +=1;
                            break;
                        case 9:
                            count2[7] +=1;
                            break;
                        case 10:
                            count2[8] +=1;
                            break;
                        case 11:
                            count2[9] += 1;
                            break;

                    }
                }

                textBox1.Text += (count2[0] + count2[1] + count2[2] + count2[3] + count2[4] + count2[5] + count2[6] + count2[7] +
                    count2[8] + count2[9] + count2[10]+"\r\n");
                textBox1.Text += "2出現率:" + (count2[0] / 100) + "%\r\n";
                textBox1.Text += "3出現率:" + (count2[1] / 100) + "%\r\n";
                textBox1.Text += "4出現率:" + (count2[2] / 100) + "%\r\n";
                textBox1.Text += "5出現率:" + (count2[3] / 100) + "%\r\n";
                textBox1.Text += "6出現率:" + (count2[4] / 100) + "%\r\n";
                textBox1.Text += "7出現率:" + (count2[5] / 100) + "%\r\n";
                textBox1.Text += "8出現率:" + (count2[6] / 100) + "%\r\n";
                textBox1.Text += "9出現率:" + (count2[7] / 100) + "%\r\n";
                textBox1.Text += "10出現率:" + (count2[8] / 100) + "%\r\n";
                textBox1.Text += "11出現率:" + (count2[9] / 100) + "%\r\n";
                textBox1.Text += "12出現率:" + (count2[10] / 100) + "%\r\n";

    這是執行結果(應該要擲出一萬次,但總數只有8193,而且6、7兩個數出現次數不管執行幾次都是0,請問各位大大是不是哪裡寫法有問題,看了好久)

    謝謝各位大大!


                                    
    2012年3月22日 上午 03:33

解答

  •                     case 6:
                            count[4] +=1;
                            break;
                        case 7:
                            count[5] +=1;
                            break;

    嗯……您有沒有覺得,這兩個case的變數長得和其它的case不太一樣?

    這時就要提一下,變數的取名也是很重要的,可以避免這種要考驗眼力的問題


    zeus

    • 已提議為解答 阿尼 2012年3月22日 上午 04:02
    • 已標示為解答 a020212 2012年3月22日 上午 08:57
    2012年3月22日 上午 03:56
  • ...
                        case 5:
                            count2[3] +=1;
                            break;
                        case 6:
                            count[4] +=1;
                            break;
                        case 7:
                            count[5] +=1;
                            ...

    這是執行結果(應該要擲出一萬次,但總數只有8193,而且6、7兩個數出現次數不管執行幾次都是0,請問各位大大是不是哪裡寫法有問題,看了好久)

     

    你在 case 6 和 7 中,用錯了count2 為 count

    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    2012年3月22日 上午 04:07
  • 你也可以直接用一個variable 去取代 count,這樣用少一點resource。

    int RandomNumber;
                double[] count2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    
                Random num = new Random();
                for (int i = 0; i < 10000; i++)
                {
                    RandomNumber = num.Next(2, 13);
                    switch (RandomNumber)
                    {
                        case 2:
                            count2[0] += 1;
                            break;
                        case 3:
                            count2[1] += 1;
                            break;
                        case 4:
                            count2[2] += 1;
                            break;
                        case 5:
                            count2[3] += 1;
                            break;
                        case 6:
                            count2[4] += 1;
                            break;
                        case 7:
                            count2[5] += 1;
                            break;
                        case 8:
                            count2[6] += 1;
                            break;
                        case 9:
                            count2[7] += 1;
                            break;
                        case 10:
                            count2[8] += 1;
                            break;
                        case 11:
                            count2[9] += 1;
                            break;
                        case 12:
                            count2[10] += 1;
                            break;
    
                    }
                }
    
                
                textBox1.Text += (count2[0] + count2[1] + count2[2] + count2[3] + count2[4] + count2[5] + count2[6] + count2[7] +
                     count2[8] + count2[9] + count2[10] + "\r\n");
                textBox1.Text += "2出現率:" + (count2[0] / 100) + "%\r\n";
                textBox1.Text += "3出現率:" + (count2[1] / 100) + "%\r\n";
                textBox1.Text += "4出現率:" + (count2[2] / 100) + "%\r\n";
                textBox1.Text += "5出現率:" + (count2[3] / 100) + "%\r\n";
                textBox1.Text += "6出現率:" + (count2[4] / 100) + "%\r\n";
                textBox1.Text += "7出現率:" + (count2[5] / 100) + "%\r\n";
                textBox1.Text += "8出現率:" + (count2[6] / 100) + "%\r\n";
                textBox1.Text += "9出現率:" + (count2[7] / 100) + "%\r\n";
                textBox1.Text += "10出現率:" + (count2[8] / 100) + "%\r\n";
                textBox1.Text += "11出現率:" + (count2[9] / 100) + "%\r\n";
                textBox1.Text += "12出現率:" + (count2[10] / 100) + "%\r\n";


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    • 已標示為解答 a020212 2012年3月22日 上午 08:56
    2012年3月22日 上午 04:09

所有回覆

  • 在 MSDN 文件庫中關於 [ Random 類別 ]

     備註

    虛擬亂數是以相等的機率從有限的數字集中選取。 選取的數字並非是完全隨機,因為是使用有限性數學演算法來選取它們,但是用於實際用途已足夠。 Random 類別目前的實作是以修改過的 Donald E 版本為根據。 Knuth 的減法亂數產生器演算法。 如需詳細資訊,請參閱 D 項。 E. Knuth。 " The Art of Computer Programming, volume 2: Seminumerical Algorithms》。 Addison-Wesley, Reading, MA, second edition, 1981。

    亂數的產生始於種子值。 如果重複使用相同的種子會產生相同的連續數字。 其中一個產生不同序列的方法是讓種子值時間相依,由此以每個 Random 的新執行個體 (Instance) 產生不同的系列。 根據預設,Random 類別的無參數建構函式會使用系統時鐘來產生其種子值,而參數化的建構函式可以根據目前時間的刻度數目而接受 Int32 值。 然而,因為時鐘的解析度有限,所以若使用無參數的建構函式在極短時間內連續建立不同的 Random 物件,就會建立亂數產生器,這些產生器會產生序列完全相同的亂數。 下列範例說明短時間內連續產生一系列相同亂數的兩個 Random 物件。

    所以, 改一下建構式  Random 建構函式 (Int32)  加入不同的種子值 (比方你可以用 現在時間的 milliseconds )


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年3月22日 上午 03:54
    版主
  • ...請列出出現2~12點的次數與機率...

                   ...
                    count[i]=num.Next(2,13);
                    switch(count[i]%12)
                    {
                        case 0:
                            count2[10] +=1;
                            break;
                        case 2:
                            count2[0] +=1;
                            break;
                        ...

    ...應該要擲出一萬次,但總數只有8193....                                

    所以你要改為 count[i]=num.Next(2,12);


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003


    2012年3月22日 上午 03:54
  •                     case 6:
                            count[4] +=1;
                            break;
                        case 7:
                            count[5] +=1;
                            break;

    嗯……您有沒有覺得,這兩個case的變數長得和其它的case不太一樣?

    這時就要提一下,變數的取名也是很重要的,可以避免這種要考驗眼力的問題


    zeus

    • 已提議為解答 阿尼 2012年3月22日 上午 04:02
    • 已標示為解答 a020212 2012年3月22日 上午 08:57
    2012年3月22日 上午 03:56
  • ...
                        case 5:
                            count2[3] +=1;
                            break;
                        case 6:
                            count[4] +=1;
                            break;
                        case 7:
                            count[5] +=1;
                            ...

    這是執行結果(應該要擲出一萬次,但總數只有8193,而且6、7兩個數出現次數不管執行幾次都是0,請問各位大大是不是哪裡寫法有問題,看了好久)

     

    你在 case 6 和 7 中,用錯了count2 為 count

    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    2012年3月22日 上午 04:07
  • 你也可以直接用一個variable 去取代 count,這樣用少一點resource。

    int RandomNumber;
                double[] count2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    
                Random num = new Random();
                for (int i = 0; i < 10000; i++)
                {
                    RandomNumber = num.Next(2, 13);
                    switch (RandomNumber)
                    {
                        case 2:
                            count2[0] += 1;
                            break;
                        case 3:
                            count2[1] += 1;
                            break;
                        case 4:
                            count2[2] += 1;
                            break;
                        case 5:
                            count2[3] += 1;
                            break;
                        case 6:
                            count2[4] += 1;
                            break;
                        case 7:
                            count2[5] += 1;
                            break;
                        case 8:
                            count2[6] += 1;
                            break;
                        case 9:
                            count2[7] += 1;
                            break;
                        case 10:
                            count2[8] += 1;
                            break;
                        case 11:
                            count2[9] += 1;
                            break;
                        case 12:
                            count2[10] += 1;
                            break;
    
                    }
                }
    
                
                textBox1.Text += (count2[0] + count2[1] + count2[2] + count2[3] + count2[4] + count2[5] + count2[6] + count2[7] +
                     count2[8] + count2[9] + count2[10] + "\r\n");
                textBox1.Text += "2出現率:" + (count2[0] / 100) + "%\r\n";
                textBox1.Text += "3出現率:" + (count2[1] / 100) + "%\r\n";
                textBox1.Text += "4出現率:" + (count2[2] / 100) + "%\r\n";
                textBox1.Text += "5出現率:" + (count2[3] / 100) + "%\r\n";
                textBox1.Text += "6出現率:" + (count2[4] / 100) + "%\r\n";
                textBox1.Text += "7出現率:" + (count2[5] / 100) + "%\r\n";
                textBox1.Text += "8出現率:" + (count2[6] / 100) + "%\r\n";
                textBox1.Text += "9出現率:" + (count2[7] / 100) + "%\r\n";
                textBox1.Text += "10出現率:" + (count2[8] / 100) + "%\r\n";
                textBox1.Text += "11出現率:" + (count2[9] / 100) + "%\r\n";
                textBox1.Text += "12出現率:" + (count2[10] / 100) + "%\r\n";


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    MVP for VB.NET since 2003

    • 已標示為解答 a020212 2012年3月22日 上午 08:56
    2012年3月22日 上午 04:09
  • 變數命名確實很重要,尤其對於我這種少根筋的人來說。

    也感謝前輩的提醒,才發現用來儲存亂數的陣列是多餘的。

    謝謝各位前輩的幫忙

    2012年3月22日 上午 08:56
  • RandomNumber = num.Next(2, 13);

    count2[RandomNumber - 2] += 1;


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月22日 下午 12:35
  • 其他參考:

    假亂數:http://social.msdn.microsoft.com/Search/zh-TW/?query=%E5%81%87%E4%BA%82%E6%95%B8&refinement=112&ac=8

    蒙地卡羅:https://www.google.com.tw/#hl=zh-TW&site=&source=hp&q=%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月22日 下午 12:37