[解決済み] 範囲から乱整数を生成する
2022-04-22 16:32:23
質問
与えられた範囲(境界値を含む)のランダムな整数を生成する関数が必要です。品質や乱数性についての無理な要求はしませんが、4つの要求があります。
- 高速であることが必要です。私のプロジェクトでは、何百万(時には何千万)もの乱数を生成する必要があり、現在使用しているジェネレータ関数がボトルネックになっていることが判明しています。
- 適度に均一であることが必要です(rand()の使用は全く問題ありません)。
- 最小から最大の範囲は、<0, 1> から <-32727, 32727> までの範囲です。
- はseedableでなければならない。
現在、以下のようなC++のコードを持っています。
output = min + (rand() * (int)(max - min) / RAND_MAX)
問題は、それが本当に均一ではないことです - rand() = RAND_MAX (Visual C++では1/32727)のときだけ、maxが返されます。これは、最後の値がほとんど返されない <-1, 1> のような小さな範囲では大きな問題です。
そこで、紙とペンを持って、次の式を思いついた((int)(n + 0.5) 整数丸めのトリックをベースにしたものである)。
しかし、まだ一様な分布にはなりません。10000サンプルで繰り返し実行すると、値 -1, 0, 1 に対して 37:50:13 という比率になります。
より良い計算式を教えてください。(あるいは、擬似乱数生成器全体の関数でもかまいません。)
どのように解決するのですか?
高速で、あなたよりいくらかましだが、まだ適切に一様分布していない解決策は、次のとおりです。
output = min + (rand() % static_cast<int>(max - min + 1))
ただし、範囲の大きさが2のべき乗の場合を除く。
このメソッドは
偏った非一様な分布
数
の品質にかかわらず
rand()
. このメソッドの品質を総合的にテストするには
読む
.
関連
-
[解決済み] テスト
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] JavaScriptで特定の範囲のランダムな整数を生成する?
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] 英数字のランダムな文字列を生成する方法
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] 0から9までのランダムな整数を生成する
-
[解決済み】大文字と数字を含むランダムな文字列の生成
-
[解決済み】乱数発生器が1つの乱数しか発生させない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++