[解決済み] JavaScriptで特定の範囲のランダムな整数を生成する?
質問
JavaScript で、指定した 2 つの変数の間にランダムな整数を生成するには、どうすればよいでしょうか。
x = 4
と
y = 8
のいずれかを出力します。
4, 5, 6, 7, 8
?
解決方法は?
には、いくつかの例があります。 モジラデベロッパーネットワーク のページをご覧ください。
/**
* Returns a random number between min (inclusive) and max (exclusive)
*/
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
/**
* Returns a random integer between min (inclusive) and max (inclusive).
* The value is no lower than min (or the next integer greater than min
* if min isn't an integer) and no greater than max (or the next integer
* lower than max if max isn't an integer).
* Using Math.round() will give you a non-uniform distribution!
*/
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
その理屈はこうだ。シンプルな3つのルールです。
Math.random()
が返されます。
Number
0 (包含) と 1 (排他) の間にある。つまり、このような区間ができるわけです。
[0 .................................... 1)
の間の数字が必要です。
min
(含む) と
max
(排他的)です。
[0 .................................... 1)
[min .................................. max)
を使うことができます。
Math.random
を使えば,[min, max]区間で対応するものを得ることができます.しかし,まず,問題を少し因数分解して
min
を2番目の区間から削除する。
[0 .................................... 1)
[min - min ............................ max - min)
これは、与える。
[0 .................................... 1)
[0 .................................... max - min)
を適用することができます。
Math.random
を計算し、対応するものを算出します。乱数を選んでみよう。
Math.random()
|
[0 .................................... 1)
[0 .................................... max - min)
|
x (what we need)
ということで、探すために
x
を行うことになります。
x = Math.random() * (max - min);
を忘れずに追加してください。
min
を戻すと、[min, max]区間の数値が得られます。
x = Math.random() * (max - min) + min;
これがMDNにある最初の関数です。2つ目の関数は
min
と
max
は、両方を含む。
さて、整数を得るには、次のようにします。
round
,
ceil
または
floor
.
を使うことができます。
Math.round(Math.random() * (max - min)) + min
しかし、これは均等でない分布になります。両方です。
min
と
max
は約半分の確率でしか転がりません。
min...min+0.5...min+1...min+1.5 ... max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘ ← Math.round()
min min+1 max
と
max
を除外しているため、ロールする確率は
min
.
と
Math.floor(Math.random() * (max - min +1)) + min
を使えば、完全に均等な分布になります。
min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
| | | | | |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘ ← Math.floor()
min min+1 max-1 max
を使用することはできません。
ceil()
と
-1
というのは、その式に
max
が出る可能性が少し低くなりましたが、(不要な)
min-1
という結果も得られます。
関連
-
vueが定義するプライベートフィルタと基本的な使い方
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】gulp anythingを実行するたびに、アサーションエラーが発生します。- タスク関数を指定する必要があります
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] 0から9までのランダムな整数を生成する
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
親子コンポーネント通信を解決する3つのVueスロット
-
Vueの要素ツリーコントロールに破線を追加する説明
-
jsを使った簡単な照明スイッチのコード
-
JavaScriptのクロージャの説明
-
vue ディレクティブ v-html と v-text
-
[解決済み] Error : 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み] テスト
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】ReactJSでエラー発生 Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。