JavaScriptで2つの数値の間に乱数を生成する


1798

JavaScriptで指定された範囲(1から6まで:1、2、3、4、5、または6など)の乱数を生成する方法はありますか?


12
Math.floor(Math.random()* 7)
Amjad

65
確かに.. Math.floor(Math.random()* 6 + 1)
Amjad

3
Nabil Kadimiは、負の乱数を生成する方法についての記事も書きました。
madc 2012

ここに便利な要点があります:gist.github.com/kerimdzhanov/7529623
Dan KK

なぜこのようなソリューションがw3schools.com/jsref/jsref_random.asp .. Math.floor((Math.random()*10)+1);で指定されているように機能しないのですか?
シャシュワット2014年

回答:


2117

重要

次のコードは、最小値がの場合にのみ機能します1。以外の最小値では機能しません1

1(および1のみ)と6の間のランダムな整数を取得する場合、次のように計算します。

Math.floor(Math.random() * 6) + 1  

どこ:

  • 1は開始番号です
  • 6は可能な結果の数です(1 +開始(6) -終了(1)

45
これは機能しますが、@ Mike、Franciscが以下に持っているため、より一般的なバージョンを指摘するのが最善です:-)。
Raymond Machira 2013

59
-1。グーグルの後、私はこの質問を見つけました。タイトルは、「JavaScriptで2つの数値間にランダムな値を生成する」です。最小値が0の場合は機能しません
Ydhem

18
たとえば、2つの大きな数値の間の数値が必要な場合は機能しません。Math.floor(Math.random()* 900)+ 700
Rob

15
これは、最小値が1の場合にのみ機能します。最小値が2であり、まだ使用Math.floor(Math.random() * 6) + 2している場合、Math.random()結果が0.99の場合、ランダム値は次のようになります7
抗毒性

28
このコードは、どの番号でも機能しないため、適切ではありません。@Franciscコードが正しいです。
ライオンキング

2286
function randomIntFromInterval(min, max) { // min and max included 
  return Math.floor(Math.random() * (max - min + 1) + min);
}

「追加」とは、1で始まらないランダムな間隔を許可することです。したがって、たとえば10から15までの乱数を取得できます。柔軟性。


5
誰かが含まれていない場合ので、これも素晴らしいですtoargを、from最大としてargを兼ね
ジェイソン

12
こんにちは。これはMDNからです:Returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Francisc

5
上記のコメントを読んでください。ランダムは[0,1]ではなく[0,1)の中にあります。
Francisc

3
下の数が0であれば素晴らしい作品
ロビン・ツィンマーマン

2
この解決策は、minとmaxが整数の場合にのみ正しいことに注意してください。そうでない場合、間隔[min、ceil(max)]で結果を得ることができます。つまり、最大値よりも高いため、範囲外の結果を得ることができます。
collimarco 14

329

Math.random()

min(含まれる)とmax(含まれる)の間の整数の乱数を返します。

function randomInteger(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

または最小(含まれる)と最大(含まれない)の間の任意の乱数

function randomNumber(min, max) {
  return Math.random() * (max - min) + min;
}

有用な例(整数):

// 0 -> 10
Math.floor(Math.random() * 11);

// 1 -> 10
Math.floor(Math.random() * 10) + 1;

// 5 -> 20
Math.floor(Math.random() * 16) + 5;

// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;

**そして、いつでも思い出せます(Mozilla):

Math.random()は暗号的に安全な乱数を提供しません。セキュリティに関連するものには使用しないでください。代わりにWeb Crypto APIを使用し、より正確にはwindow.crypto.getRandomValues()メソッドを使用します。


私を混乱させた何か... Math.floor(..)は、数値がMath.round(..)が不均一な分布を与える整数であることを保証します。参照:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…–
alikuli

1
私はこの答えを信頼しています。これが機能する理由を誰かがリンクまたは明確な説明を提供できますか?おそらく、Math.roundがどのようにバイアスを与えるか、そしてそれがなぜこのかなり複雑に見える式を使用しなければならないのかという例ですか?
ロビンアンドリュース

6
@alikuliの範囲について[1,2]、25%の確率でありMath.random()、これらのいずれかからあなたの番号を与えるだろうが[0,0.49][0.5,0.99][1,1.49][1.5,1.99]。これらの間隔を丸めると、0、1、1、2になります。これは、均等な分布ではありません。、0、0に1をそれらの結果を床材、1
pishpish

1
@shujiこれ、特に正しい答えです。Math.roundover Math.floorを使用すると異なる結果が得られる理由を明確にしたかっただけです。
ピシュピッシュ

私が見つけた最も正確な解決策: function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
サディク

91

その他の解決策:

  • (Math.random() * 6 | 0) + 1
  • ~~(Math.random() * 6) + 1

オンラインで試す


6
~~シンタクシスについて説明(または参照を与える)してもいいですか?見たことがない!エレガントなソリューションですが、理解が困難です。
DiegoDD 2013年

27
ダブルチルダ ~~aビット単位のOR(| 0)Math.floor()を書くためのより高速な方法です
edi9999

7
a | 0また、文字列を整数に変換するための最も高速で最適化された方法です。これは、整数("444"および"-444")を含む文字列、つまり、浮動小数点数/分数では機能しません。0失敗したすべてのものを生成します。これはasm.jsの背後にある主要な最適化の1つです。
ピラウ14年

3
注:非常に大きな数を処理している場合は、二重チルドは機能しません。試してみてください~~(Math.random() * (50000000000000 - 0 + 1)) + 0Math.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
BrunoLM

3
「ダブルチルドとビット単位OR /は、数学のドットフロアを書くためのより速い方法です」は、私の朝を明るくした美しい韻のカプレットです。ありがとう@ edi9999!
teedyay

60

TL; DR

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max + 1 - min))
}

乱数を取得するには generateRandomInteger(-20, 20);

以下の説明

ランダムな整数、たとえばXを最小値と最大値の間で取得する必要があります。

正しい?

つまり、 最小<= X <=最大

方程式からminを引くと、これは

0 <=(X-最小)<=(最大-最小)

さて、これに乱数r を掛けてみましょう。

0 <=(X-最小)* r <=(最大-最小)* r

今、方程式に最小値を追加してみましょう

最小<=最小+(X-最小)* r <=最小+(最大-最小)* r

ここで、方程式の範囲[min、max]を満たすようなrをもたらす関数を選択してみましょう。これは、0 <= r <= 1の場合にのみ可能です

OK。ここで、r ie [0,1] の範囲は、Math.random()関数の結果と非常によく似ています。だよね?

Math.random()関数は、範囲[0、1]の浮動小数点の疑似乱数を返します。つまり、0(両端を含む)から1を含まない(両端を含まない)まで

例えば、

ケースr = 0

min+ 0 *(max- min)=

ケースr = 1

min+ 1 *(max- min)= 最大

Math.random 0 <= r <1を使用したランダムなケース

min+ r *(max- min)= X、ここでXの範囲はmin <= X <最大

上記の結果Xはランダムな数値です。ただし、Math.random()により、左の境界は包括的で、右の境界は排他的です。右境界を含めるには、右境界を1増やして結果をフロアします。

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max + 1 - min))
}

乱数を取得するには

generateRandomInteger(-20, 20);



24
var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;

2
確かに。ランドが0であることを忘れていました。修正しました。
ryebr3ad 2011

3
それは疑似コードの一部です...誰かがそれを本物だと思って、そのように使用しようとするかもしれません。
重力少年

35
@gravityboy何言ってるの?誰かが[pick a number ...]の代わりに数字を使用できない場合は、プログラマーとして適していない可能性があります。
ryebr3ad

7
@ ryebr3ad -1!疑似コードではなくJavaScriptで述べられており、すべてのリーダーがプログラマーであるとは限りません。多くは初心者です!
スティーブ

3
@ ryebr3ad:私には、インターンがサポートを必要とするデータベース環境についてインターンを教えていた同僚がいました。彼はテーブルからすべてを選択するように彼らに言いました、そして彼らはSQLクエリエディターで直接「すべてを選択して...」を書き始めました。彼はあなたがしたのと同じ反応を持っていました。
Ellesedil 2015

22

jsfiddle:https ://jsfiddle.net/cyGwf/477/

Random Integer:との間minでランダムな整数を取得するmaxには、次のコードを使用します

function getRandomInteger(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min;
}

ランダムな浮動小数点数:間のランダムな浮動小数点数を取得するminmax、次のコードを使用します

function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}

リファレンス:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random


14

数学は私の長所ではありませんが、私は正と負の両方の間で多くの乱数を生成する必要があるプロジェクトに取り組んできました。

function randomBetween(min, max) {
    if (min < 0) {
        return min + Math.random() * (Math.abs(min)+max);
    }else {
        return min + Math.random() * max;
    }
}

例えば

randomBetween(-10,15)//or..
randomBetween(10,20)//or...
randomBetween(-200,-100)

もちろん、検証を追加して、数値以外でこれを実行しないようにすることもできます。また、minが常にmax以下であることを確認してください。


5
これは単に間違っています。min + Math.random() * maxminとmin + maxの間の数値が表示されますが、これは必要なことではありません。の最初のブランチifは正しいですがreturn min + Math.random() * (max - min)、と言って簡略化できます。これは、minが正か負かに関係なく正しいソリューションです(他の回答を参照)。また、分数が必要ない場合でも、結果をフロアする必要があることに注意してください。
Avish 2013年

10

私は乱数だけでなく整数を与えることができるより柔軟な関数を書きました。

function rand(min,max,interval)
{
    if (typeof(interval)==='undefined') interval = 1;
    var r = Math.floor(Math.random()*(max-min+interval)/interval);
    return r*interval+min;
}

var a = rand(0,10); //can be 0, 1, 2 (...) 9, 10
var b = rand(4,6,0.1); //can be 4.0, 4.1, 4.2 (...) 5.9, 6.0

修正バージョン。


これは最小値としてゼロでは機能しないため、良い解決策ではありません。@Liorの答えを見てください。
Sebastien 2015

もちろん、最小値としてゼロを使用します。試しましたか?それが機能しないかもしれない理由はありません。不思議ではない間隔として0を使用しても機能しません(間隔= 0?...)。
ElChupacabra 2015

私は最小値としてゼロを使用してこの関数を複数回実行し、出力でゼロを取得しませんでした。または、私は十分に幸運ではありません...
セバスチャン

あなたが正しいです。「+間隔」が間違った場所にありました。今すぐテストしてください。3.0.1のように、console.logが0.3の代わりに0.300000004を返すという奇妙なことは、正確には0.3ではないでしょう。
ElChupacabra 2015

9

1から10までの乱数を返します。

Math.floor((Math.random() * 10) + 1);

結果は次のようになります。 3

自分で試してください:ここに

-

またはlodash / undescoreを使用:

_.random(min, max)

ドキュメント:-lodash - undescore


1
あなたは9か10が必要ですか?はいの場合:const randomNumber = Math.floor((Math.random()* 10)+ 1)const nineOrTen = randomNumber%2 === 0?9:10
セバスティアン・ララ

7

多くの回答とほぼ同じ結果にもかかわらず。私は私の答えを追加して、その働きを説明したいと思います。1行のコードをコピーして貼り付けるのではなく、その動作を理解することが重要だからです。乱数を生成することは単純な数学に他なりません。

コード:

function getR(lower, upper) {

  var percent = (Math.random() * 100);
  // this will return number between 0-99 because Math.random returns decimal number from 0-0.9929292 something like that
  //now you have a percentage, use it find out the number between your INTERVAL :upper-lower 
  var num = ((percent * (upper - lower) / 100));
  //num will now have a number that falls in your INTERVAL simple maths
  num += lower;
  //add lower to make it fall in your INTERVAL
  //but num is still in decimal
  //use Math.floor>downward to its nearest integer you won't get upper value ever
  //use Math.ceil>upward to its nearest integer upper value is possible
  //Math.round>to its nearest integer 2.4>2 2.5>3   both lower and upper value possible
  console.log(Math.floor(num), Math.ceil(num), Math.round(num));
}

6

TypeScriptで記述された乱数ジェネレータを検索していて、すべての回答を読んだ後、これを記述しました。これがTypeScriptのコーダーで機能することを願っています。

    Rand(min: number, max: number): number {
        return (Math.random() * (max - min + 1) | 0) + min;
    }   

5

Math.random() は高速で多くの目的に適していますが、暗号で保護された値が必要な場合(安全ではない)、または完全に均一な不偏分布から整数が必要な場合(他の回答で使用されている乗算アプローチは、特定の値をわずかに頻繁に生成します)他より)。

そのような場合、を使用crypto.getRandomValues()して安全な整数を生成し、ターゲット範囲に均一にマッピングできない生成された値を拒否できます。これは遅くなりますが、非常に多数の値を生成する場合を除いて、重要ではありません。

偏った分布の問題を明確にするために、1から5までの値を生成したいが、1から16までの値(4ビット値)を生成する乱数ジェネレータがあるとします。各出力値に同じ数の生成された値をマッピングしたいのですが、16は5で均等に除算されません。残りの1を残します。したがって、可能な生成された値の1つを拒否し、ターゲット範囲に均一にマッピングできる15の小さい値の1つ。私たちの行動は次の疑似コードのようになります。

Generate a 4-bit integer in the range 1-16.
If we generated  1,  6, or 11 then output 1.
If we generated  2,  7, or 12 then output 2.
If we generated  3,  8, or 13 then output 3.
If we generated  4,  9, or 14 then output 4.
If we generated  5, 10, or 15 then output 5.
If we generated 16 then reject it and try again.

次のコードは同様のロジックを使用しますが、代わりに32ビット整数を生成しますnumber。これは、JavaScriptの標準型で表すことができる最大の一般的な整数サイズであるためです。(これはBigInt、より大きな範囲が必要な場合にs を使用するように変更できます。)選択した範囲に関係なく、拒否される生成値の割合は常に0.5未満になるため、予想される拒否の数は常に1.0未満であり、通常は0.0に近い。永久にループすることを心配する必要はありません。

const randomInteger = (min, max) => {
  const range = max - min;
  const maxGeneratedValue = 0xFFFFFFFF;
  const possibleResultValues = range + 1;
  const possibleGeneratedValues = maxGeneratedValue + 1;
  const remainder = possibleGeneratedValues % possibleResultValues;
  const maxUnbiased = maxGeneratedValue - remainder;

  if (!Number.isInteger(min) || !Number.isInteger(max) ||
       max > Number.MAX_SAFE_INTEGER || min < Number.MIN_SAFE_INTEGER) {
    throw new Error('Arguments must be safe integers.');
  } else if (range > maxGeneratedValue) {
    throw new Error(`Range of ${range} (from ${min} to ${max}) > ${maxGeneratedValue}.`);
  } else if (max < min) {
    throw new Error(`max (${max}) must be >= min (${min}).`);
  } else if (min === max) {
    return min;
  } 

  let generated;
  do {
    generated = crypto.getRandomValues(new Uint32Array(1))[0];
  } while (generated > maxUnbiased);

  return min + (generated % possibleResultValues);
};

console.log(randomInteger(-8, 8));          // -2
console.log(randomInteger(0, 0));           // 0
console.log(randomInteger(0, 0xFFFFFFFF));  // 944450079
console.log(randomInteger(-1, 0xFFFFFFFF));
// Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295.
console.log(new Array(12).fill().map(n => randomInteger(8, 12)));
// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9]


さて、これは私が過剰と呼んでいるものです。
2xSamurai

2
@ 2xSamuraiそこで、私は答えを更新して、なぜこれが必要になるのか、そしてそれがどのように機能するのかを説明しました。それは良いですか?:P
Jeremy Banks

暗号化された安全で均一に分散された乱数が必要な場合は、過剰ではありません。これらの要件を満たす乱数を生成することは困難です。@JeremyBanks、すばらしい回答です。
thomaskonrad

4

@Francisc の回答のfloatバージョンに基づいて、固定精度バージョンで追加しintます。

function randomFloatFromInterval (min, max, fractionDigits) {
  const fractionMultiplier = Math.pow(10, fractionDigits)
  return Math.round(
    (Math.random() * (max - min) + min) * fractionMultiplier,
  ) / fractionMultiplier
}

そう:

randomFloatFromInterval(1,3,4) // => 2.2679, 1.509, 1.8863, 2.9741, ...

そしてint答えのために

randomFloatFromInterval(1,3,0) // => 1, 2, 3


1

これはうまくいくはずです:

const getRandomNum = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min

1

ES6のデフォルトパラメータを使用してこれを行う優れた新しい方法を発見しました。1つの引数または2つの引数を許可するため、非常に気の利いたものです。ここにあります:

function random(n, b = 0) {
    return Math.random() * (b-n) + n;
}

1

これは約9年遅れですが、randojs.comはこれをシンプルなワンライナーにします。

rando(1, 6)

これをhtmlドキュメントの先頭に追加するだけで、ランダム性を使用してほとんど何でも簡単に行うことができます。配列からのランダムな値、ランダムなjquery要素、オブジェクトからのランダムなプロパティ、そして必要に応じて繰り返しを防止します。

<script src="https://randojs.com/1.0.0.js"></script>

依存関係を追加して、既にワンライナーになっていることを実行するのはなぜですか?JSコミュニティにライブラリを追加することへの執着はクレイジーです
Daniel Cooke

読みやすく、覚えやすい。私も同意します
アーロンPlocharczyk

1

これは私にとってはうまくいき、Pythonのrandom.randint標準ライブラリ関数のような値を生成します:


function randint(min, max) {
   return Math.round((Math.random() * Math.abs(max - min)) + min);
}

console.log("Random integer: " + randint(-5, 5));


1

基本的にサイコロのように1-6を返すには、

return Math.round(Math.random() * 5 + 1);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.