天天看點

控制随機抽中幾率 [ C# | Random ] (2)

  普通随機抽取分别進行1000次和10000次測試顯示:

          1000次

 10000次

 控制随機幾率随機抽取分别進行1000次和10000次代碼修改:

          1.     将rc.RandomExtract(rand)改為rc.ControllerRandomExtract(rand)

          2.     注釋掉上面輸出部分代碼,加上以下代碼:

            Dictionary<char,ushort> items = new Dictionary<char,ushort>();

            for (int i = 0,j = rc.datas.Count; i < j; i++)

            {

                items.Add(rc.datas[i],rc.weights[i]);

            }

            Console.WriteLine("\t\t出現次數\t占總共出現次數百分比\t權值");

            foreach (KeyValuePair<char, int> item in result)

                Console.WriteLine(item.Key + "\t\t" + item.Value.ToString() + "\t\t" + ((double)item.Value / (double)(FOR_COUNT * COUNT)).ToString("0.00%") + "\t\t\t" + items[item.Key]);

          測試結果:

小結

     從上面統計結果可以看出,普通随機數分布比較均勻,随機抽中的幾率相對持平;但是經過控制随機抽中幾率,權值高的明顯抽中幾率要高,另外需要注意的是這裡隻輸出了25個字母,也就是還有一個字母沒有被抽中過,因為按算法他是始終不會出現的,除非一次抽26個!!

     需要注意的是:

          1.     合理的調配權值和随機數生成的大小也很有關系,大家可以看到權值5的和權值1的出現幾率相差不是5倍,而是30-50倍。

          2.     如果資料源随機的資料大,比如上千上萬條,按現在的程式是不可行的,可以先随機抽取比所需抽取個數多2-5倍的資料,然後直接按權值排序然後抽取前N位來達到目的。

          3.     最重要的一點就是注意随機性,這個算法如果不是建立在随機的機制上是毫無價值的!!

本文轉自over140 51CTO部落格,原文連結:http://blog.51cto.com/over140/586455,如需轉載請自行聯系原作者

繼續閱讀