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

あなたの例については完全にはわかりませんが、一般的なガイドラインは、1 つのインスタンスSystem.Random(またはマルチスレッド アプリケーションの場合はスレッドごとに 1 つのインスタンス) を作成し、それを複数回使用することです。

次のようなことを試してください:

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 に答える