none
程式自動執行時,亂數生成的樹會產生多組重複值才變換,手動除錯卻沒問題 RRS feed

  • 問題

  • 各位前輩們

    以下是我程式問題
    我使用方法與陣列去亂數隨機生成50棵樹根與左右子樹
    我一步步除錯時,我的樹不會重複
    但在程式自動執行的時候
    樹會重複個幾次才會換新的之後又重複幾次(重複的次數沒有規律)

    請問 是哪邊出了問題?
    不好意思,剛學寫程式比較不會Debug

    謝謝

    以下是我的程式碼:

    private void btn_createtree_Click(object sender, EventArgs e)
            {
                sp = float.Parse(num_select.Value.ToString()) / 100;
                cp = float.Parse(num_crossover.Value.ToString()) / 100;
                mp = float.Parse(num_mutation.Value.ToString()) / 100;
                int rnd;
                //generation = int.Parse(num_generation.Value.ToString());基因演化次數
                population_size = int.Parse(num_population.Value.ToString());
                string[,] tmptree = new string[population_size,3];//這一代幾棵樹
                for (int i = 0; i < tmptree.GetLength(0); i++)
                {
                    Random r = new Random();
                    rnd = r.Next(0, 5);
                    tmptree[i, 0] = operator_num[rnd].ToString();//root
                    level = r.Next(2, 6);//2到5層+1root
                    tmptree[i, 1] = create_tree(level);//left
                    level = r.Next(2, 6);
                    tmptree[i, 2] = create_tree(level);//right
                    show.Text += "No. " + (i + 1) + " tree:" + Environment.NewLine + "root:" + tmptree[i, 0] + Environment.NewLine + "left:" + tmptree[i, 1]
                        + Environment.NewLine + "right:" + tmptree[i, 2] + " → level:" + level + Environment.NewLine + Environment.NewLine;
                }
                //fitness_sum = fitness_avg = 0;
            }
    
            private string create_tree(int level)
            {
                string s;
                string[][] l = new string[level][];
                Random r = new Random();
                int rnd, count;
                bool isfirst = true;
                for (int i = 0; i < level; i++)
                {
                    count = 0;                
                    if (isfirst!=false)
                    {
                        isfirst = false;
                        rnd = r.Next(0, 5);//+-*/%隨機
                        l[i] = new string[] { operator_num[rnd].ToString() };
                        count += 2;
                        l[i + 1] = new string[count];
                    }
                    else if (i < level - 1 && i > 0)//第二至level-1層
                    {
                        for (int j = 0; j < l[i].Length; j++)
                        {
                            rnd = r.Next(0, operator_num.Length);
                            l[i][j] = operator_num[rnd].ToString();
                            if (rnd < 5)
                                count += 2;
                            else
                                count++;
                        }
                        l[i + 1] = new string[count];
                    }
                    else//最後一層開始
                    {
                        for (int j = 0; j < l[i].Length; j++)
                        {
                            rnd = r.Next(0, num_data);
                            l[i][j] = rnd.ToString();
                        }
                    }
                }
                //如何顯示
                s = null;
                for (int i = 0; i < l.GetLongLength(0); i++)
                {
                    for (int j = 0; j < l[i].Length; j++)
                    {
                        if (j == l[i].Length - 1)
                            s += l[i][j] + " / ";
                        else
                            s += l[i][j] + ",";
                    }
                }     
                return s;
            }

    一步步執行時結果(不會重複多筆)

    No. 1 tree:
    root:E
    left:E / D,I / 40,40,35 / 
    right:E / D,I / F,F,E / B,I,B,F / 36,26,15,29,33,0 /  → level:5

    No. 2 tree:
    root:C
    left:C / D,E / 3,14,57,23 / 
    right:C / D,E / 3,14,57,23 /  → level:3

    No. 3 tree:
    root:B
    left:B / H,A / C,C,G / A,C,D,E,F / 14,41,26,51,40,40,5,47,39 / 
    right:B / 54,5 /  → level:2

    No. 4 tree:
    root:D
    left:D / F,B / F,G,I / 67,40,48 / 
    right:D / 39,8 /  → level:2

    No. 5 tree:
    root:B
    left:B / I,G / G,D / B,B,C / 11,4,25,5,53,61 / 
    right:B / I,G / G,D / 14,11,22 /  → level:4

    No. 6 tree:
    root:D
    left:D / F,A / D,H,E / 11,2,42,10,31 / 
    right:D / 42,3 /  → level:2

    No. 7 tree:
    root:C
    left:C / 6,19 / 
    right:C / A,C / 5,32,51,16 /  → level:3

    No. 8 tree:
    root:B
    left:B / 7,40 / 
    right:B / A,F / D,I,G / 6,9,53,3 /  → level:4

    No. 9 tree:
    root:E
    left:E / I,E / D,B,H / B,G,F,D,D / 34,67,46,15,12,33,39,9 / 
    right:E / I,E / 28,14,54 /  → level:3

    No. 10 tree:
    root:A
    left:A / I,B / A,B,I / A,C,D,H,C / 48,20,55,63,37,35,54,67,12 / 
    right:A / 67,7 /  → level:2

    No. 11 tree:
    root:E
    left:E / D,E / 59,44,58,25 / 
    right:E / D,E / 59,44,58,25 /  → level:3

    No. 12 tree:
    root:A
    left:A / E,B / 33,44,64,18 / 
    right:A / 32,10 /  → level:2

    No. 13 tree:
    root:B
    left:B / F,H / A,F / 2,10,29 / 
    right:B / F,H / A,F / A,B,D / 4,32,32,6,62,48 /  → level:5

    No. 14 tree:
    root:C
    left:C / G,E / G,F,B / 3,67,61,61 / 
    right:C / G,E / 48,44,8 /  → level:3

    No. 15 tree:
    root:A
    left:A / 4,58 / 
    right:A / A,H / E,A,A / D,A,H,G,I,C / 15,33,56,40,35,9,16,66,44 /  → level:5

    No. 16 tree:
    root:B
    left:B / 10,35 / 
    right:B / B,E / B,A,B,C / 40,47,9,49,33,37,42,35 /  → level:4

    No. 17 tree:
    root:E
    left:E / I,D / B,C,C / D,B,E,E,D,B / 58,4,28,21,21,33,23,12,0,48,53,42 / 
    right:E / I,D / 13,21,17 /  → level:3

    No. 18 tree:
    root:A
    left:A / 2,3 / 
    right:A / 2,3 /  → level:2

    No. 19 tree:
    root:B
    left:B / 9,48 / 
    right:B / B,G / D,C,D / 7,18,12,22,2,39 /  → level:4

    No. 20 tree:
    root:A
    left:A / E,A / C,G,D,E / 22,9,9,41,38,32,66 / 
    right:A / 36,5 /  → level:2

    No. 21 tree:
    root:B
    left:B / F,G / H,G / 33,23 / 
    right:B / F,G / H,G / 33,23 /  → level:4

    No. 22 tree:
    root:B
    left:B / G,D / E,G,F / 15,29,55,67 / 
    right:B / G,D / 33,50,40 /  → level:3

    No. 23 tree:
    root:C
    left:C / H,A / B,G,G / B,I,F,D / 8,11,27,24,21,6 / 
    right:C / 55,5 /  → level:2

    No. 24 tree:
    root:B
    left:B / 14,30 / 
    right:B / B,E / 64,12,43,31 /  → level:3

    No. 25 tree:
    root:C
    left:C / C,B / 37,12,49,23 / 
    right:C / 20,8 /  → level:2

    No. 26 tree:
    root:A
    left:A / 6,66 / 
    right:A / A,I / F,D,H / D,B,C,I / 11,3,1,39,21,53,10 /  → level:5

    No. 27 tree:
    root:B
    left:B / 12,43 / 
    right:B / B,F / B,D,I / 20,49,6,28,0 /  → level:4

    No. 28 tree:
    root:C
    left:C / C,C / 56,26,67,12 / 
    right:C / C,C / 56,26,67,12 /  → level:3

    No. 29 tree:
    root:D
    left:D / D,I / 29,26,5 / 
    right:D / D,I / D,D,A / A,H,G,C,G,F / 65,65,27,59,17,19,61,12 /  → level:5

    No. 30 tree:
    root:B
    left:B / G,D / C,H,A / D,H,G,A,C / 43,65,42,55,58,47,9,52 / 
    right:B / G,D / 18,57,3 /  → level:3

    No. 31 tree:
    root:C
    left:C / H,A / H,H,B / C,D,E,E / 6,57,18,50,34,14,49,24 / 
    right:C / 58,1 /  → level:2

    No. 32 tree:
    root:D
    left:D / I,G / E,H / C,B,I / 26,64,63,3,39 / 
    right:D / I,G / E,H / 15,13,67 /  → level:4

    No. 33 tree:
    root:E
    left:E / 3,24 / 
    right:E / A,D / 8,56,21,5 /  → level:3

    No. 34 tree:
    root:D
    left:D / E,G / 64,18,19 / 
    right:D / E,G / I,C,C / 28,40,12,12,23 /  → level:4

    No. 35 tree:
    root:B
    left:B / 16,39 / 
    right:B / C,F / I,E,D / 32,11,67,34,66 /  → level:4

    No. 36 tree:
    root:C
    left:C / D,C / 40,33,30,25 / 
    right:C / 22,16 /  → level:2

    No. 37 tree:
    root:D
    left:D / D,I / 14,33,36 / 
    right:D / D,I / B,E,E / C,C,G,D,F,C / 55,24,41,67,4,14,7,12,12,44 /  → level:5

    No. 38 tree:
    root:E
    left:E / E,F / H,E,F / 10,56,34,54 / 
    right:E / E,F / H,E,F / 10,56,34,54 /  → level:4

    No. 39 tree:
    root:C
    left:C / I,I / F,I / F,E / 59,31,41 / 
    right:C / I,I / F,I / F,E / 59,31,41 /  → level:5

    No. 40 tree:
    root:D
    left:D / 0,41 / 
    right:D / A,F / C,I,G / 25,29,20,2 /  → level:4

    No. 41 tree:
    root:E
    left:E / 7,19 / 
    right:E / A,C / 60,62,52,18 /  → level:3

    No. 42 tree:
    root:A
    left:A / 13,64 / 
    right:A / B,I / E,I,H / B,E,I,I / 39,8,4,35,54,28 /  → level:5

    No. 43 tree:
    root:E
    left:E / F,C / D,D,H / 33,40,62,47,10 / 
    right:E / F,C / 23,24,56 /  → level:3

    No. 44 tree:
    root:E
    left:E / 6,32 / 
    right:E / A,E / 11,9,2,7 /  → level:3

    No. 45 tree:
    root:C
    left:C / E,H / 67,39,67 / 
    right:C / E,H / I,F,I / E,G,F / 31,42,67,46 /  → level:5

    No. 46 tree:
    root:D
    left:D / F,E / F,F,A / 22,18,27,60 / 
    right:D / F,E / F,F,A / 22,18,27,60 /  → level:4

    No. 47 tree:
    root:E
    left:E / G,B / C,F,B / 15,56,16,22,20 / 
    right:E / 45,12 /  → level:2

    No. 48 tree:
    root:A
    left:A / G,H / H,F / C,B / 25,5,51,9 / 
    right:A / G,H / H,F / C,B / 25,5,51,9 /  → level:5

    No. 49 tree:
    root:D
    left:D / F,G / H,H / 23,11 / 
    right:D / F,G / H,H / 23,11 /  → level:4

    No. 50 tree:
    root:C
    left:C / I,A / G,C,C / E,A,H,H,D / 19,63,15,13,36,12,52,65 / 
    right:C / 64,4 /  → level:2

    程式自動執行完結果(重複多筆才會換)

    No. 1 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 2 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 3 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 4 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 5 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 6 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 7 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 8 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 9 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 10 tree:
    root:E
    left:E / F,H / C,F / 15,34,50 / 
    right:E / F,H / C,F / C,E,G / 50,56,47,8,28 /  → level:5

    No. 11 tree:
    root:D
    left:D / I,D / E,D,D / C,C,F,D,G,H / 49,57,51,48,29,65,63,42,20 / 
    right:D / I,D / 30,27,23 /  → level:3


    • 已編輯 江尚瑀 2017年4月8日 下午 02:58
    2017年4月8日 下午 02:56

解答

  • 線上手冊就有寫原因。

    https://msdn.microsoft.com/zh-tw/library/h343ddh9.aspx

    註解

    預設種子值衍生自系統時鐘,而且具有有限的解析度。 如此一來,不同 Random 連續呼叫預設建構函式所建立的物件都有相同的預設種子值,因此,將會產生隨機數字的同一組。 即可避免這個問題,請使用單一 Random 物件產生所有的隨機數字。 您也可以解決它藉由修改系統時鐘所傳回的種子值,並明確地提供這個新的初始值來 Random(Int32) 建構函式。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年4月8日 下午 04:07

所有回覆

  • 線上手冊就有寫原因。

    https://msdn.microsoft.com/zh-tw/library/h343ddh9.aspx

    註解

    預設種子值衍生自系統時鐘,而且具有有限的解析度。 如此一來,不同 Random 連續呼叫預設建構函式所建立的物件都有相同的預設種子值,因此,將會產生隨機數字的同一組。 即可避免這個問題,請使用單一 Random 物件產生所有的隨機數字。 您也可以解決它藉由修改系統時鐘所傳回的種子值,並明確地提供這個新的初始值來 Random(Int32) 建構函式。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年4月8日 下午 04:07
  • 謝謝您的指教,我會再更精進我的問法。
    2017年4月8日 下午 06:32
  • 回樓主:

    你的問法沒有問題,至於心冷大的 "不精確的問法......",是他的簽名檔,每個回答都會出現的 (有看到一條線嗎?);並不是針對你的問題內容。


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

    2017年4月8日 下午 08:19
    版主
  • 本來簽名檔是小字,還算好分

    論壇改版後,就一直是讓人容易混淆,到論壇建議區提過,也一直是這樣。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年4月9日 上午 05:10
  • 原來~我現在才發現!!!!! 謝謝你們:D
    2017年10月23日 上午 05:39