2015年11月3日 星期二

如何產生隨機不重覆的數字

方法一
http://www.allenkuo.com/EBook5/view.aspx?TreeNodeID=72&id=1423

//static void Main(string[] args)
        {
        var hs = new HashSet();
        int counter = 1;
        int con = int.Parse(TextBox1.Text);
        //int con = 10;
        var rnd = new Random();
        while (hs.Count < con)
        {
           counter++;
                hs.Add(rnd.Next(con)+1);
            }

        //Console.WriteLine("一共取了" + counter + "亂數才完成");

        //Console.WriteLine("結果如下:");
        string sum = "";
            foreach (int item in hs){
              //Console.Write(item.ToString() + ", ");

                sum = sum + item.ToString() + ", ";
            }
            Label1.Text = sum;
            Label2.Text = "一共取了" + counter + "次亂數才完成";
        Console.WriteLine("");
        }

方法二
http://blog.yljh.mlc.edu.tw/blog/blog_form.asp?blog=paguma&view=writings&writing_id=301

Option Base 1
  /* Option Base 是指定陣列註標值開始的指令
  /* Option Base 1 表示陣列元素從 1 開始
  /* Option Base 後方只能接 0 或 1

Dim I, K, X, Temp, A(42) As Integer
  /*宣告所需使用到的變數及陣列
  /* A(42)包含的元素有 A(1)、A(2)....A(42) 

For K = 1 To 42
 A(K) = K
Next K

  /* 利用 For 迴圈將數值依序存入陣列
  /* 當 K = 1 時,A(1) = 1
  /* 當 K = 2 時,A(2) = 2
  /* ................. 
  /* 當 K = 42時,A(42) = 42

Randomize
  /* 使用Rnd函數時,務必在使用前加上 Randomize指令
  /*Randomize為啟動亂數種子,後方可加整數 -32768 ~ 32768
  /*功能是讓 Rnd()函數產生的亂數更不規則
  /*若沒有加上此指令時,每次執行產生的亂數將會固定

For I = 1 To 6
 X = Int(Rnd()*(42-I+1))+1
 Temp = A(X)
 A(X) = A(42-I+1)
 A(42-I+1) = Temp
Print A(42-I+1) & " ";
Next I

  /* For I = 1 To 6 代表要執行 6 次動作
  /* X 是代表每次隨機選取的值,原來應是 X=INT(Rnd()*42)+1
  /* 因為每次選取的範圍要遞減
  /* 第1次1~42選1個,第2次1~41個選1個,第3次...
  /* 也就是第1次為 Rnd*42,第2次為 Rnd*41,第3次...
  /* 我們利用 I 值每回合都會加 1 的特性加到程式碼
  /* Rnd()*42 調整為 Rnd()*(42-I+1)
  /* 重覆6次,每次 X 值取亂數的範圍都會少1
  /*
  /* 再來是將隨機選取的位置與最後位置的數值做交換
  /* 每個回合最後的位置並不是固定在 A(42)
  /* 第1次為 A(42),第2次為 A(41),第3次...
  /* 每回合最後的位置配合 I 值調整為 A(42-I+1)
  /* 底下為將數值互換的程式
  /* Temp=A(X) : A(X)=A(42-I+1) : A(42-I+1)=Temp
  /*
  /* 最後是每個回合都將取得的數值印出
  /* 因為是放在每回合最後的位置,因此是 Print A(42-I+1)

沒有留言: