0

可能重复:
F# 获取随机数列表

我每次都在滴答声(计时器)上从列表中获取随机值,但我得到相同的 3 次,然后它才改变......

编码:

let timer = new DispatcherTimer()
timer.Tick.Add  <| fun _ -> X.Change()
timer.Interval  <- new TimeSpan(0,0,3)    

    member X.Change() = 
        (Seq.nth
            (System.Random().Next(Seq.length actions))
                <| actions)()

为什么?我想每次都得到不同的价值

4

1 回答 1

2

我不完全确定您的示例,但一般准则是您应该创建一个实例System.Random(或每个线程一个实例,如果您有一个多线程应用程序),然后多次使用它。

尝试这样的事情:

let timer = new DispatcherTimer() 
let rnd = new System.Random()
timer.Tick.Add  <| fun _ -> X.Change() 
timer.Interval  <- new TimeSpan(0,0,3)     

    member X.Change() =  
        (Seq.nth 
            (rnd.Next(Seq.length actions)) 
                <| actions)() 

Random对象是可变的并保持一些用于生成随机值序列的状态。当您创建一个新实例时,它会使用当前时间初始化状态,因此如果您同时创建多个实例,您将获得相同的数字。

顺便说一句,如果您需要访问 的随机元素actions,那么最好将它们存储为数组,因为这样您就可以编写:

member X.Change() =  
  actions.[rnd.Next(actions.Length)]()
于 2012-09-21T10:23:25.207 回答