0から39までのランダムな値を持つ40個の要素を持つ配列を作成するにはどうすればよいですか?好む
[4, 23, 7, 39, 19, 0, 9, 14 ...]
ここからソリューションを使用してみました:
http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm
しかし、私が取得した配列はほとんどランダム化されていません。それは連続した数字のブロックをたくさん生成します...
一意数のリストをシャッフルするソリューションを次に示します(繰り返しはありません)。
for (var a=[],i=0;i<40;++i) a[i]=i;
// http://stackoverflow.com/questions/962802#962890
function shuffle(array) {
var tmp, current, top = array.length;
if(top) while(--top) {
current = Math.floor(Math.random() * (top + 1));
tmp = array[current];
array[current] = array[top];
array[top] = tmp;
}
return array;
}
a = shuffle(a);
繰り返しの値(OPが望んでいたものではない)を許可したい場合は、別の場所を見てください。 :)
最短アプローチ(ES6)
// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));
楽しい!
ES5:
function randomArray(length, max) {
return Array.apply(null, Array(length)).map(function() {
return Math.round(Math.random() * max);
});
}
ES6:
randomArray = (length, max) => [...new Array(length)]
.map(() => Math.round(Math.random() * max));
さらに短いES6アプローチ:
Array(40).fill().map(() => Math.round(Math.random() * 40))
また、引数を持つ関数を使用することもできます。
const randomArray = (length, max) =>
Array(length).fill().map(() => Math.round(Math.random() * max))
Math.random()
は、0〜1の数値を返します(排他的)。したがって、0〜40が必要な場合は、40で乗算できます。結果が最高になるのは、乗算する値です。
var arr = [];
for (var i=0, t=40; i<t; i++) {
arr.Push(Math.round(Math.random() * t))
}
document.write(arr);
最短:-)
[...Array(40)].map(e=>~~(Math.random()*40))
..私が得る配列は、ほとんどランダム化されていません。それは連続した数字のブロックをたくさん生成します...
ランダムアイテムのシーケンスには、多くの場合、連続した番号のブロックが含まれます。 ギャンブラーの誤acy を参照してください。例えば:
..連続して4つのヘッドを投げたところです。5つの連続したヘッドが走る確率はたった1⁄32なので、ギャンブラーの誤acyにさらされている人は、この次のフリップがヘッドよりも少ないと信じているかもしれません。尾になります。 http://en.wikipedia.org/wiki/Gamblers_fallacy
数値の範囲が制限されているため、最善の方法は、配列を生成し、0から39の数値で(順番に)埋めてからシャッフルすることです。
毎日の単線ソリューションをクォークします。
配列の値は完全にランダムであるため、このスニペットを使用する場合は異なります。
小文字のランダムな文字を含む配列(長さ10)
Array.apply(null, Array(10)).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); })
['k'、 'a'、 'x'、 'y'、 'n'、 'w'、 'm'、 'q'、 'b'、 'j']
0から99までのランダムな整数を持つ配列(長さ10)
Array.apply(null, Array(10)).map(function() { return Math.floor(Math.random() * 100 % 100); })
[86、77、83、27、79、96、67、75、52、21]
ランダムな日付の配列(10年前から現在まで)
Array.apply(null, Array(10)).map(function() { return new Date((new Date()).getFullYear() - Math.floor(Math.random() * 10), Math.floor(Math.random() * 12), Math.floor(Math.random() * 29) )})
[2008-08-22T21:00:00.000Z、2007-07-17T21:00:00.000Z、
2015-05-05T21:00:00.000Z、2011-06-14T21:00:00.000Z、
2009-07-23T21:00:00.000Z、2009-11-13T22:00:00.000Z、
2010-05-09T21:00:00.000Z、2008-01-05T22:00:00.000Z、
2016-05-06T21:00:00.000Z、2014-08-06T21:00:00.000Z]
配列(長さ10)ランダム文字列
Array.apply(null, Array(10)).map(function() { return Array.apply(null, Array(Math.floor(Math.random() * 10 + 3))).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); }).join('') });
['cubjjhaph'、 'bmwy'、 'alhobd'、 'ceud'、 'tnyullyn'、 'vpkdflarhnf'、 'hvg'、 'arazuln'、 'jzz'、 'cyx']
あなたがここで見つけることができる他の有用なもの https://github.com/setivolkylany/nodejs-utils/blob/master/utils/faker.js
var myArray = [];
var arrayMax = 40;
var limit = arrayMax + 1;
for (var i = 0; i < arrayMax; i++) {
myArray.Push(Math.floor(Math.random()*limit));
}
上記はこれを行う従来の方法ですが、高価な計算を行わずに配列内の重複を避けたい場合は、@ Pointyと@Phrogzを2番目に使用します
let randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));
見やすいように配列を6つの値に制限しました。
ES6のいくつかの新しい機能を使用して、これを次の方法で実現できます。
function getRandomInt(min, max) {
"use strict";
if (max < min) {
// Swap min and max
[min, max] = [min, max];
}
// Generate random number n, where min <= n <= max
let range = max - min + 1;
return Math.floor(Math.random() * range) + min;
}
let values = Array.from({length: 40}, () => getRandomInt(0, 40));
console.log(values);
このソリューションは、矢印関数とArray.from()のES6機能をサポートする最新のブラウザーでのみ機能することに注意してください。
これらのソリューションが提供したものとは少し異なるものが必要でした。指定された範囲に保持された多数の異なる乱数を持つ配列を作成する必要があったからです。以下は私の解決策です。
function getDistinctRandomIntForArray(array, range){
var n = Math.floor((Math.random() * range));
if(array.indexOf(n) == -1){
return n;
} else {
return getDistinctRandomIntForArray(array, range);
}
}
function generateArrayOfRandomInts(count, range) {
var array = [];
for (i=0; i<count; ++i){
array[i] = getDistinctRandomIntForArray(array, range);
};
return array;
}
多くの不要な呼び出しが発生する可能性のあるループを作成しないことをお勧めします(カウントと範囲が高く、同じ番号に近い場合)が、これは私が考え出すことができる最高です。
0 ... lengthの範囲のランダムな一意の値で必要な場合:
const randomRange = length => {
const results = []
const possibleValues = Array.from({ length }, (value, i) => i)
for (let i = 0; i < length; i += 1) {
const possibleValuesRange = length - (length - possibleValues.length)
const randomNumber = Math.floor(Math.random() * possibleValuesRange)
const normalizedRandomNumber = randomNumber !== possibleValuesRange ? randomNumber : possibleValuesRange
const [nextNumber] = possibleValues.splice(normalizedRandomNumber, 1)
results.Push(nextNumber)
}
return results
}
randomRange(5) // [3, 0, 1, 4, 2]
@Phrogzによって提案されたページから
for (var i=0,nums=[];i<49;i++) nums[i]={ n:i, Rand:Math.random() };
nums.sort( function(a,b){ a=a.Rand; b=b.Rand; return a<b?-1:a>b?1:0 } );
function shuffle(maxElements) {
//create ordered array : 0,1,2,3..maxElements
for (var temArr = [], i = 0; i < maxElements; i++) {
temArr[i] = i;
}
for (var finalArr = [maxElements], i = 0; i < maxElements; i++) {
//remove rundom element form the temArr and Push it into finalArrr
finalArr[i] = temArr.splice(Math.floor(Math.random() * (maxElements - i)), 1)[0];
}
return finalArr
}
この方法は、乱数ジェネレーターによってのみ制限される確率の問題を解決すると思います。