none
请教一个生成不重复随机数的最佳方法? RRS feed

  • 问题

  • 我需要随机抽取一个长度为55000的数组内的40000个元素,我现在采用的方法是用Random随机生成一组数组索引(0~40000),为了避免随机数重复,我每生成一个随机数,便进行比较,当重复时重生生成随机数然后再次进行比较,直到不重复,但是这导致整个运算过程非常缓慢(将近5min),想请教各位有没有更加高效嘅方法来避免随机数重复,谢谢


    2012年10月10日 19:01

答案

  • 已經解決!我現在採用的方法是生成55000*20個0~55000隨機索引值,再利用ToArray.Distinct()刪除重複元素,如果刪除重複元素後,儲存索引值的數組內的元素數量正好等於40000,即達到目的,如果不足40000(因爲隨機數上限,所以不會超過40000),則返回第一步重新生成(99%不會不足)

    多謝各位提供嘅幫助,我原本“一组数组索引(0~55000))”寫錯了,應該是0~40000

    • 已标记为答案 Chung ZS 2012年10月11日 6:09
    2012年10月11日 6:08

全部回复

  • 读出来以后就把对应索引的元素设置成一个不会出现的值,比如-1.

    下次再取时,只要判断当前值是不是-1就行了


    http://feiyun0112.cnblogs.com/

    2012年10月11日 1:05
    版主
  • 您好

    可嘗試使用 LINQ 的方式,參考以下代碼

            Dim result = Enumerable.Range(0, 55000).OrderBy(Function(n) n * n * (New Random()).[Next]()).Take(40000)


    歡迎參觀我的Blog【菜鳥自救會】 【粉絲專頁】

    2012年10月11日 1:17
  • 我需要隨機抽取一個長度爲55000的數組內的40000個元素,我現在採用的方法是用Random隨機生成一組數組索引(0~55000),爲了避免隨機數重複,我每生成一個隨機數,便進行比較,當重複時重生生成隨機數然後再次進行比較,直到不重複,但是這導致整個運算過程非常緩慢(將近5min),想請教各位有沒有更加高效嘅方法來避免隨機數重複,謝謝

    参考这样的随机数生成法:

    namespace CSharp { public class MainTest { static List<int> RandomNumbers(int from, int to) { List<int> numbers = new List<int>(); Random r = new Random(Guid.NewGuid().GetHashCode()); for (int i = from; i <=to; i++) { numbers.Insert(r.Next(0, numbers.Count), i); } return numbers; } static void Main(string[] args) { //打印55000个数字 int counter = 1; foreach (var item in RandomNumbers(1,55000)) { Console.Write(item + ","); counter++; if (counter == 10) { Console.WriteLine(); counter = 1; } } } } }

    //随后再抽取4000个,必定是随机的!;)


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月11日 2:42
    版主
  • 已經解決!我現在採用的方法是生成55000*20個0~55000隨機索引值,再利用ToArray.Distinct()刪除重複元素,如果刪除重複元素後,儲存索引值的數組內的元素數量正好等於40000,即達到目的,如果不足40000(因爲隨機數上限,所以不會超過40000),則返回第一步重新生成(99%不會不足)

    多謝各位提供嘅幫助,我原本“一组数组索引(0~55000))”寫錯了,應該是0~40000

    • 已标记为答案 Chung ZS 2012年10月11日 6:09
    2012年10月11日 6:08