Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#使用System.Random()获取随机数列表,并给出相同的列表_Random_F#_Math.net - Fatal编程技术网

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

F#使用System.Random()获取随机数列表,并给出相同的列表,random,f#,math.net,Random,F#,Math.net,我一直在搜索其他问题,用户会在循环或方法中实例化许多System.Random(),从而从同一个时钟创建许多相同的随机数。但是这里我有一个实例化的System.Random(),但是当我尝试使用它创建多个随机数列表时,它们都是相同的 module Scripts = let rnd = System.Random() let getRandom36 = let rec generate (l : list<int>) = match l.Length wi

我一直在搜索其他问题,用户会在循环或方法中实例化许多
System.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)

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

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
设rnd=System.Random()
让我们来看看=
让rec生成(l:列表)=
将l.长度与
|8->l
|_->让编号=rnd。下一个38
如果(List.exists(fun elem->elem=number)l),则生成l,否则生成(number::l)
List.sort(生成List.empty)
让myseq=Seq.init 4获取随机数36

问题在于
getRandom36
是一个值,而不是一个函数。它被计算一次,然后总是返回相同的列表。将其转换为函数,它应能正常工作:

module Scripts =

    let rnd = System.Random ()

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

    let myseq = Seq.init 4 (fun _ -> getRandom36 ())

虽然OP可能正在使用递归寻找一个非常具体的解决方案,但有更简单/更快的方法可以通过使用股票
System.random
生成随机数

例如:

#load @"..\..\FSLAB\packages\FsLab\FsLab.fsx"

open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.Distributions
open MathNet.Numerics.Random

let rng = Random.shared
Array2D.init<int> 4 8 (fun i j -> rng.Next(38)) 
let fillArray (x:int []) = rng.NextInt32s(x,0,38)
let xs = [|for i in 1..4 -> Array.zeroCreate<int> 8|]
xs |> Array.map (fun x -> fillArray(x))

rnd。下一个38是得到一个介于0和38之间的随机数:-)是的,对不起,不应该在手机上阅读:)你需要递归和列表吗?顺便说一句,不需要感到愚蠢。这是一个很常见的错误。
let fillArray (x:int []) = rng.NextInt32s(x,0,38)
let xs = [|for i in 1..4 -> Array.zeroCreate<int> 8|]
xs |> Array.map (fun x -> fillArray(x))