Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 720 - [乱数] もう少しランダム数を考える

2019年5月21日:Swift 4.2の復習中

話題が転々としてますが、再び「乱数」を考えます。

数日前に理解できていなかった次に示すメソッド、やっと理解できましたコンピュータサイエンスでは常識的な内容なんですが、基礎知識の無い独学50オヤジは、こういう基本原理が弱いです(^^;)

func random() -> CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}

arc4random()を使って(擬似的に)生み出す乱数の範囲は「0〜2の32乗」だったんですね*1。「2の32乗」を16進法で表記すると、「0xFFFFFFFF」になるんです。

すなわち10進法で言えば、「4294967296」ってことです。発生する乱数の最大値で除算しているので、乱数の範囲は「0.000000000から1」になります。

そして次のメソッドで好きな範囲で乱数を発生させることができます。上手い!

func random(min min: CGFloat, max: CGFloat) -> CGFloat {
  return random() * (max - min) + min
}

... と終わってしまうのはSwift 4.2までの話です。Swift 4.2から乱数の取り扱いが楽になっています。
Swiftで遊ぼう! - 997 - Swift 4.2で乱数の扱いが変わりました! - Swiftで遊ぼう! on Hatena

例えば、もう使われなくなった「arc4random()」と同じ乱数を発生するためには次のようにするのでしょう。

UInt32.random(in: 0 ..< 4294967295)

でも、これを利用する必要はないんです。この場合、CGFloat型の0〜1の乱数を発生すればいいので次のように記述すえばいいですね。

CGFloat.random(in: 0 ... 1)

超簡単ですね!

と言うことは、つぎのように色々な型の乱数を発生できます。

let randomIntFrom0To10 = Int.random(in: 0 ..< 10)
let randomFloat = Float.random(int: 0 ..< 1)

そして、ランダムに要素を抽出することもできます。

let greetings = ["hey", "hi", "hello", "hola"]
print(greetings.randomElement()!)

配列をシャッフルするメソッドも用意されています。

let randomlyOrderedGreetins = greetings.shuffled()
print(randomlyOrderedGreetins)

そして、自分で定義した乱数発生プログラムを組み込む事もできるんです。

おっと、ここの組み込みは、まだしっかり理解できていないので、また後日説明します。

*1:[http://yataiblue.hatenablog.com/entry/2016/07/03/000000:title=Appleのドキュメントに書かれていますが、符号の無いUInt32ができます