F#列表。使用随机数映射

F#列表。使用随机数映射,f#,F#,我想创建一个包含20个随机数的列表。我写道: let numberList = [ 1 .. 20 ] let randoms = numberList |> List.map (fun (x) -> System.Random().Next(0,9)) 我得到了这个: val numberList : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 1

我想创建一个包含20个随机数的列表。我写道:

let numberList = [ 1 .. 20 ] 
let randoms = 
    numberList 
    |> List.map (fun (x) -> System.Random().Next(0,9)) 
我得到了这个:

val numberList : int list =
  [1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20]
val randoms : int list =
  [7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7; 7]
这是有道理的。问题是,每次对函数进行如下计算时,我都希望传入一个随机数:

let numberList = [ 1 .. 20 ] 
let randoms = 
    numberList 
    |> List.map (fun (Random().Next(0,9)) -> x) 
但我得到了一个“模式鉴别器‘随机’未定义”的例外

我是否以错误的方式处理这个问题?
提前感谢

在原始版本中,您可以在每次迭代中创建一个新的随机对象。由于这是当前时间的种子,因此始终创建相同的序列

您需要像这样在贴图外部创建对象

let RNG = new System.Random()
numberlist |> List.map (fun x -> RNG.Next(0,9))
虽然更优雅的解决方案是

let RNG = new System.Random()
let randoms = List.init 20 (fun _ -> RNG.Next(0,9))

您的第二个版本失败了,因为您试图将随机视为一种模式,在这种情况下没有任何意义。

当我完全限定随机参数时,如:System.Random()。下一步(0,9),我得到一个结果,这不是变量、常量、活动识别器或可能的文本副本