以前の質問で教えていただいた内容について調べてみたのですが、どれを参考にしていいのやら困っています。
参考にするべきサイト、または方法自体教えていただければありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
>どれを参考に 迷っている候補を挙げてください
rand()を使えと紹介されているけど、swiftでは使えなかったりswiftで検索しても整数の乱数生成しか出てこなかったりと、そもそもこれといった記事が見つけられずに困っています。

回答2件
0
rand()そのものである必要はないでしょう。
rand()を使っている記事が見つかったのであれば「rand() → 整数の乱数」と置き換えて読めばいいです。
投稿2017/12/27 06:49
総合スコア16733
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
https://qiita.com/shu223/items/489b1b9193dc1b53308b
このページを見つけたのですが、ARC4RANDOM_MAXにしろRAND_MAXにしろ要は取り得る値の最大値で割ることで1以下にしているという認識で良いのでしょうか?
またその場合このサイトでは
#define ARC4RANDOM_MAX 0x100000000
と定義していますがswiftでARC4RANDOM_MAXというのはどの様に定義すれば良いのでしょうか?
0x100000000というのが理解できないのですがどの様に出てきた数値なのでしょうか?
最大である必要はありませんが、そういう認識でいいと思います。
0〜1に正規化しているということです。
0x100000000は十分に大きな値という意味でしょう。
どの程度大きければ良いかは用途次第です。(前回の質問で、あなたが100ではダメだと書いていましたが、まぁそういうことです)
用途によらず汎用化したいのであれば UInt32.max か、ギリギリ過ぎて不安なら Int32.max にしておくとか。
最大値でなくても良いとなると1を超える値が出てきてしまうのではないですか?
0x100000000って0にならないんですか?
そこが大きな値という認識ができなくて、、、
(float)arc4random()/ARC4RANDOM_MAX)でUInt32.maxを使った書き方をすると(float)arc4random(UInt32.max)/UInt32.max)となるということですか?
あぁ、失礼。記事ではarc4random()を使っているのですね。arc4random()は「0 to (2**32)-1」の値を返しますので、その値に+1して 0x100000000 を使っています。
で、調べてみると分かりますが、乱数取得にはarc4random()ではなくarc4random_uniform()を使うことをお勧めします。
arc4random_uniformを使った場合(float)arc4random_uniform(UInt32.max)/UInt32.max)ということでしょうか?
上記の方法でやってみたところ0しか生成されません。
どう修正すれば良いのでしょうか?

0
ベストアンサー
0しか生成されないのはUint32型で除算をしているからではないでしょうか。
下記のように除算の前に各項をDobule型、もしくは、Float型に変換すればよいと考えます。
let actual = Double(arc4random_uniform(UInt32.max))/Double(UInt32.max - 1)
print(actual)
投稿2018/01/02 05:01
編集2018/01/02 12:10総合スコア2655
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
ありがとうございます。
無事それらしい値が表示されました。
ちなみに質問の内容はこの方法で実装できていますかね?
質問の内容というのが「0から1の乱数」ということであれば、母数がUint32.maxのままだと1多くなるので、回答文の式を変更しました。
nakasho_devさんのおっしゃる1多くなるという理屈はわかるのですが
http://sa.eei.eng.osaka-u.ac.jp/tatsumi/tani_prog/num/random.html
こことかでは逆に1を足しているのですがそもそもrand()が違う働きをしているということですか?
iOSと関係ないページを提示いただいているようですが、乱数発生器についてはOSや言語で色々と使用は異なるのではないでしょうかね。
なるほど、今回は1を引くことが正しいということですね。
ありがとうございます!

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。