回答:
シンプルなワンライナーです
const randomElement = array[Math.floor(Math.random() * array.length)];
例
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const randomMonth = months[Math.floor(Math.random() * months.length)];
console.log("random month =>", randomMonth);
var rand = myArray[Math.random() * myArray.length>>0]
少し速いことを思い出します
var rand = myArray[Math.random() * myArray.length | 0]
プロジェクトにアンダースコアまたはロダッシュがすでに含まれている場合は、を使用できます_.sample
。
// will return one item randomly from the array
_.sample(['January', 'February', 'March']);
複数のアイテムをランダムに取得する必要がある場合は、アンダースコアの2番目の引数として渡すことができます。
// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);
または_.sampleSize
lodashでメソッドを使用します:
// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);
ランダムな値をたくさん取得することを計画している場合は、その関数を定義することをお勧めします。
まず、これをコードのどこかに配置します。
Array.prototype.sample = function(){
return this[Math.floor(Math.random()*this.length)];
}
今:
[1,2,3,4].sample() //=> a random element
CC0 1.0ライセンスの条件に基づいてパブリックドメインにリリースされたコード。
.sample()
、任意の配列を呼び出してランダムなアイテムを取得できます
~~
はよりもはるかに高速でMath.Floor()
あるため、UI要素を使用して出力を生成する際のパフォーマンスの最適化に関しては~~
、ゲームに勝ちます。より詳しい情報
var rand = myArray[~~(Math.random() * myArray.length)];
しかし、Math.Floor()
ビット単位演算子が大きな数で奇妙に動作するため、配列に何百万もの要素が含まれることがわかっている場合は、ビット単位演算子との間で再考した方がよいかもしれません。出力で説明されている以下の例を参照してください。より詳しい情報
var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343
Math.floor
前回とは異なるランダムなアイテムを選択したいとします(実際にはランダムではありませんが、それでも一般的な要件です)...
@Markusの回答に基づいて、別のプロトタイプ関数を追加できます。
Array.prototype.randomDiffElement = function(last) {
if (this.length == 0) {
return;
} else if (this.length == 1) {
return this[0];
} else {
var num = 0;
do {
num = Math.floor(Math.random() * this.length);
} while (this[num] == last);
return this[num];
}
}
そしてそのように実装します:
var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)
固定値(月の名前のリストなど)があり、1行のソリューションが必要な場合
var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]
配列の2番目の部分は、JavaScriptで[5,6,8,7] [1,2] = 8を使用する理由で説明されているアクセス操作です。
最短バージョン:
var myArray = ['January', 'February', 'March'];
var rand = myArray[(Math.random() * myArray.length) | 0]
| 0
ますか?
| 0
自体は何もしないビット単位の演算ですが、JavaScriptでは浮動小数点はビット単位の演算の前にintに変換されます。つまり、これ+ ''
は実際には何もしない方法ですが、文字列に変換するために使用できます。
Math.floor
ではありませんが、ここで行うのは正しいことです。これは演算子なので、Math.floor
コードの実行中にいつでも実行できMath.floor = someOtherFunction
、 '|'に対して同じことを実行できないので、場合よりも高速です。一方などのためMath.floor
と|
さまざまな試みているMath.floor(-1.5)
対-1.5 | 0
。ちなみに括弧は必要ありません。|
優先度は非常に低くなっています。
Pascualのソリューションのように1行で記述したい場合は、ES6のfind関数を使用してそれを記述します(n
アイテムから1つをランダムに選択する確率はであるという事実に基づいています1/n
)。
var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i));
console.log(item);
テストの目的で、別の変数にのみ配列を保存しない正当な理由がある場合は、このアプローチを使用してください。それ以外の場合は、他の答え(floor(random()*length
および別の関数を使用)を使用する方法です。
Faker.jsには、ランダムなテストデータを生成するための多くのユーティリティ関数があります。これは、テストスイートのコンテキストでは適切なオプションです。
const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);
コメンターが述べたように、通常はこのライブラリを製品コードで使用しないでください。
Faker
、ランダムな配列要素を選択する実際の方法をお勧めします。
Arrayプロトタイプを編集することは有害な場合があります。これは、仕事をするための簡単な機能です。
function getArrayRandomElement (arr) {
if (arr && arr.length) {
return arr[Math.floor(Math.random() * arr.length)];
}
// The undefined will be returned if the empty array was passed
}
使用法:
// Example 1
var item = getArrayRandomElement(['January', 'February', 'March']);
// Example 2
var myArray = ['January', 'February', 'March'];
var item = getArrayRandomElement(myArray);
任意の数のアイテムを返すことができる再帰的なスタンドアロン関数(lodash.sampleSizeと同じ):
function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) {
const elements = [];
function getRandomElement(arr) {
if (elements.length < numberOfRandomElementsToExtract) {
const index = Math.floor(Math.random() * arr.length)
const element = arr.splice(index, 1)[0];
elements.push(element)
return getRandomElement(arr)
} else {
return elements
}
}
return getRandomElement([...array])
}
取得するには暗号強いランダムアイテムフォームの配列を使用します
let rndItem = a=> a[rnd()*a.length|0];
let rnd = ()=> crypto.getRandomValues(new Uint32Array(1))[0]/2**32;
var myArray = ['January', 'February', 'March'];
console.log( rndItem(myArray) )
シンプルな機能:
var myArray = ['January', 'February', 'March'];
function random(array) {
return array[Math.floor(Math.random() * array.length)]
}
random(myArray);
または
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
または
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
私の意見では、プロトタイプをいじり回したり、適切なタイミングで宣言したりするよりも、ウィンドウに公開することをお勧めします。
window.choice = function() {
if (!this.length || this.length == 0) return;
if (this.length == 1) return this[0];
return this[Math.floor(Math.random()*this.length)];
}
アプリのどこでも、次のように呼び出します。
var rand = window.choice.call(array)
これにより、for(x in array)
ループを適切に使用できます
for...in
配列、または一般的には使用しないでください。あなたはプロトタイプチェーンを歩く危険を冒します。また、配列のすべてのインデックスではなく、オブジェクトのすべてのプロパティを対象としています。配列でイテレータを使用する場合は、を使用しますfor (var i = 0; i < foo.length; i++){}
。さらに、Array.prototype.forEach
代わりに何かを使用してください。
変数randをmyArray [];の呼び出し内に表示できるようにする別の変数に連結するだけで、トップアンサーの複雑さを回避する方法を見つけました。作成された新しい配列を削除し、その複雑さをいじくり回すことによって、私は実用的な解決策を思いつきました:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var myArray = ['January', 'February', 'March', 'April', 'May'];
var rand = Math.floor(Math.random() * myArray.length);
var concat = myArray[rand];
function random() {
document.getElementById("demo").innerHTML = (concat);
}
</script>
<button onClick="random();">
Working Random Array generator
</button>
</body>
</html>
concat
ここで変化しているのか混乱しています... random
それ自体は変化しておらず、他に何回も呼び出されていません...
ランダムな要素を取得する一般的な方法:
let some_array = ['Jan', 'Feb', 'Mar', 'Apr', 'May'];
let months = random_elems(some_array, 3);
console.log(months);
function random_elems(arr, count) {
let len = arr.length;
let lookup = {};
let tmp = [];
if (count > len)
count = len;
for (let i = 0; i < count; i++) {
let index;
do {
index = ~~(Math.random() * len);
} while (index in lookup);
lookup[index] = null;
tmp.push(arr[index]);
}
return tmp;
}
randojsは、これをもう少しシンプルで読みやすくします。
console.log( rando(['January', 'February', 'March']).value );
<script src="https://randojs.com/1.0.0.js"></script>
これを行う方法の例を次に示します。
$scope.ctx.skills = data.result.skills;
$scope.praiseTextArray = [
"Hooray",
"You\'re ready to move to a new skill",
"Yahoo! You completed a problem",
"You\'re doing great",
"You succeeded",
"That was a brave effort trying new problems",
"Your brain was working hard",
"All your hard work is paying off",
"Very nice job!, Let\'s see what you can do next",
"Well done",
"That was excellent work",
"Awesome job",
"You must feel good about doing such a great job",
"Right on",
"Great thinking",
"Wonderful work",
"You were right on top of that one",
"Beautiful job",
"Way to go",
"Sensational effort"
];
$scope.praiseTextWord = $scope.praiseTextArray[Math.floor(Math.random()*$scope.praiseTextArray.length)];
別の簡単な方法:
var myArray = ['keke','keko','cano','halo','zirto'];
var randomValue = myArray[Math.round((Math.random()*1000))%myArray.length];
1つのランダムな値を作成して配列に渡す
次のコードを試してください。
//For Search textbox random value
var myPlaceHolderArray = ['Hotels in New York...', 'Hotels in San Francisco...', 'Hotels Near Disney World...', 'Hotels in Atlanta...'];
var rand = Math.floor(Math.random() * myPlaceHolderArray.length);
var Placeholdervalue = myPlaceHolderArray[rand];
alert(Placeholdervalue);
Math.floor(Math.random(...))
切り捨てられる呼び出しに注意してください。