使用System.Random()获取随机数列表的F#给出了相同的列表

Cop*_*röm 3 random f# math.net

我一直在寻找其他问题,用户可以System.Random()在循环或方法中实例化许多问题,因此可以从同一个时钟创建许多相同的random.但是在这里我有一个实例化System.Random()但是当我尝试使用它创建多个随机数列表时,它们都是相同的.

module Scripts =
let rnd = System.Random() 

let getRandom36 =
    let rec generate (l : list<int>) =
        match l.Length with
        |8 -> l
        |_ -> let number = rnd.Next 38
              if(List.exists(fun elem -> elem=number) l) then generate l else generate (number::l)
    List.sort(generate List.empty)

let myseq = Seq.init 4 (fun _ -> getRandom36)
Run Code Online (Sandbox Code Playgroud)

重要的部分并不是代码内部如何getRandom36工作,我一直在篡改它以不同的方式工作,但我一直在调用时看到相同的列表myseq;;.

myseq;;
val it : seq<int list> =
  seq
    [[2; 8; 10; 11; 18; 21; 22; 35]; [2; 8; 10; 11; 18; 21; 22; 35];
     [2; 8; 10; 11; 18; 21; 22; 35]; [2; 8; 10; 11; 18; 21; 22; 35]; ...]
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?我的意思rnd.Next是每次都不应该不同,因为rnd每次迭代都没有新的实例.

Jus*_*mer 5

getRandom36是一个价值而不是一个功能.可以修改如下:

let rnd = System.Random() 

let getRandom36 _ =
    let rec generate (l : list<int>) =
        match l.Length with
        |8 -> l
        |_ -> let number = rnd.Next 38
              if(List.exists(fun elem -> elem=number) l) then generate l else generate (number::l)
    List.sort(generate List.empty)

let myseq = Seq.init 4 getRandom36
Run Code Online (Sandbox Code Playgroud)

  • 不需要感到愚蠢.这是一个很常见的错误. (2认同)