2017-03-11 5 views
3

私はBoolという静的な拡張を作成して、呼び出されるたびにランダムな真偽値を返そうとしています。私はこの仕事をしようとしています:Swift LinuxランダムなBoolを生成

static func coinFlip() -> Bool { 
    #if os(Linux) 
    srand(UInt32(time(nil))) 
    let result = Int(random() % 2) 
    if result == 0 { 
     return false 
    } else { 
     return true 
    } 
    #else 
    return arc4random_uniform(2) == 0 
    #endif 
} 

私はこれをサーバーサイドスウィフトアプリケーションで呼び出されているルートの範囲内で使用しています。最初に呼び出されるたびに、ランダムな値が返されますが、その後同じスコープ内の関数へのすべての呼び出しによって出力がランダム化されることはありません。たとえば:

coin flip false 
coin flip false 
coin flip false 
coin flip false 
coin flip false 

...しかし、私は別に改めてルートを呼び出した場合、その後、私が得ることができる::

for _ in 1...5 { 
    let coin = Bool.coinFlip() 
    if coin == true { 
     print("coin flip true") 
    } else { 
     print("coin flip false") 
    } 
} 

...これの出力を生成する

coin flip true 
coin flip true 
coin flip true 
coin flip true 
coin flip true 

srand(UInt32(time(nil)))が擬似ランダムシーケンスrandom()のランダム化にのみ問題がありますか?私は何をすべきか分からない。あなたの助けを前もってありがとう!

答えて

4

time(nil))は 方法は、1秒間隔内で複数回呼び出されたときに同じ値と乱数発生器にシード ことを意味秒、の数として現在の時刻を返します。

の各呼び出しではなく、をアプリケーション の起動時に1回だけ呼び出す必要があります。

また、機能は少し簡略化することができ、私はそれrandom() を呼ぶだろう、ないcoinFlip()

#if os(Linux) 
    srand(UInt32(time(nil))) 
#endif 

extension Bool { 
    static func random() -> Bool { 
     #if os(Linux) 
      return Glibc.random() % 2 == 0 
     #else 
      return arc4random_uniform(2) == 0 
     #endif 
    } 
} 

for _ in 1...5 { 
    print(Bool.random()) 
} 
関連する問題