ランダムな値で配列を作成する


100

0〜39のランダムな値を持つ40個の要素を持つ配列を作成するにはどうすればよいですか?お気に入り

[4, 23, 7, 39, 19, 0, 9, 14, ...]

私はここからソリューションを使用してみました:

http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm

しかし、私が取得する配列はランダム化がほとんどされていません。それは多くの連続した番号のブロックを生成します...

回答:


53

これは、一意の番号のリストをシャッフルするソリューションです(繰り返しはありません)。

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が望んだものではありません)、他の場所を調べます。:)


4
このソリューションは、数値が一意でなければならない場合に適していますが、これは完全に異なる統計的/確率的なものです。これがOPにとって明確であり、彼らの場合には関連がなかったと思いますが、特定の場合には、プログラムの正確さに大きな影響を与える可能性があります。(私は答えを批判するのではなく、将来の読者のためにフラグを立てるだけです。あなたはそれを言及したいかもしれません。)参照:en.wikipedia.org/wiki/Combination( "with"と "without
repeat

var random_array = new Array(40).fill()。map((a、i)=> a = i).sort(()=> Math.random()-0.5); これは上記と同じだと思います
Jamie337nichols

数0の生成から除外するにはどうすればよいですか?
Gosi

208

最短のアプローチ(ES6)

// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));

楽しい!


あなたが正しいです。コメントを削除しました。実際の最短経路の修正バージョン:[... Array(20)]。map(()=> {return Math.floor(Math.random()* 30)});
jaheraho

7
回答のアプローチからスペースを削除すると、提案した文字より4文字少なくなります。もちろん、ゴルフに興味がある場合は、簡単なキャラクターカットのショートカットを省略しました。[...Array(40)].map(_=>Math.ceil(Math.random()*40));自分より11文字少なく、オリジナルより7文字少なくなります。
カイルベイカー

(修正するのに十分な速さではありません- Math.ceilオプションとして0を切り捨てましたが、を使用する場合、OPの基準を満たすために* 39である必要があります。0-39ではなく1-40を受け入れることができる場合、これは機能します。それ以外の場合、に戻るための改善の特徴を減らすMath.floor
カイルベイカー

素晴らしい!!! 共有してくれてありがとう
Adriel Werlich

43

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));

1
_i引数はどうなっていますか?ES6では、間違えない限り不要です。
AfricanMatt 2017

2
@AfricanMatt _は現在の要素でiあり、現在のインデックスです。そうです、どちらの場合も不要です。必要に応じて削除できます。
Eugene Kulabuhov 2017

1
ES6のそのバージョンが機能する場所がどこにあると思いますか?Array.fromは動作します...これはコードの例です... randomArray =(length:number、max:number)=> Array.from({length}).map(()=> Math.floor(Math .random()* max));
クリスチャンマシュー

31

より短いES6アプローチ:

Array(40).fill().map(() => Math.round(Math.random() * 40))

また、引数付きの関数を作成することもできます。

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))

1
.fill()には値パラメーターが必要です
Damian Green

4
@DamianGreen- .fill()パラメータを指定しないと、配列がで埋められますundefined。これは、ここで.map()動作するために必要な唯一のものです
vsync

@Damjanは数字を繰り返さない方法はありますか?このアプローチが
気に入りました

変数を使用する@ヘンリック?🤔
Sebj

@Sebjは可能ですか?つまり、このような短いアプローチと、長さと最大として小道具を使用するアプローチは、私にとって完璧に機能します:)
Henrique


16

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);

http://jsfiddle.net/robert/tUW89/


1
明確にするために、これは数字の1ではなく文字Lであり、「l = 40」、「i <l」、および「Math.random()* l」です。フォントがわかりにくい。
Mu Mind

11

..取得した配列はランダム化されていません。それは連続した番号の多くのブロックを生成します...

ランダムなアイテムのシーケンスには、多くの場合、連続する番号のブロックが含まれています。ギャンブラーの誤りを参照してください。例えば:

..連続して4つのヘッドを投げたところです.. 5つの連続したヘッドのランの確率は1⁄32に過ぎないため、ギャンブラーの誤謬の対象となった人は、この次のフリップがヘッドよりも少ない可能性が高いと信じているかもしれません尾になる。 http://en.wikipedia.org/wiki/Gamblers_fallacy


正確に+1。実際の(統計的に)乱数が必要か、「ランダムに見える」数値が必要かを決定する必要があります。
チッコドロ2014

4

数値の範囲は制限されているので、最善の方法は、配列を生成し、0から39までの数値で(順番に)配列を埋めてから、シャッフルすることです。


ここだ、この技術の可視化(そのページが使用していますが、ひどいシャッフルアルゴリズムを)。
Phrogz 2011

私は彼がその間にすべての数を望んだことを知りませんが、むしろ完全にランダムですか?彼がランダムな順序、静的な値で問題ない場合、これは問題なく動作します。
ロバート

これでうまくいくかもしれませんが、Math.random()40回使用した場合とは少し異なる結果が得られます。
Mu Mind

4
let randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));

見やすくするために配列を6つの値に制限しました。


3
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番目に使用します。


3

毎日単一行のソリューションを使用する。

配列の値は完全にランダムであるため、このスニペットを使用する場合は異なります。

ランダムな文字が小文字の配列(長さ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


1

いくつかの新しい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機能をサポートする最新のブラウザーでのみ機能することに注意してください。


1

以下を参照してください:-

let arr = Array.apply(null, {length: 1000}).map(Function.call, Math.random)
/* will create array with 1000 elements */

0

@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 } );

0

これらのソリューションが提供するものとは少し異なるものが必要でした。指定された範囲に保持された多数の個別の乱数を持つ配列を作成する必要があったからです。以下は私の解決策です。

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
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
}

この方法は、乱数発生器によってのみ制限される確率の問題を解決すると思います。


0

0 ...長さの範囲のランダムな一意の値でそれが必要な場合:

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]

0

これは繰り返しなしでランダム配列を作成する最短の方法だと確信しています

var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5);

「かなり」、keys関数の使い方はどうArray.from(Array(40).keys()).sort(_ => Math.random() - .5)ですか?気が狂って、spread演算子を使用することもできます。しかし、それは今の私にとってはエキサイティングすぎる。
イエティ

0

パーティーには少し遅れますが、ランダム性を高めるためにrandojs.comを使用しています。次のように、ランダムにシャッフルされた0から39までの数値の配列を取得できます。

console.log(randoSequence(40));
<script src="https://randojs.com/1.0.0.js"></script>

すべてのロジスティクスに煩わされることはなく、しかも非常に読みやすく、理解しやすいです:)


0

発電機

@Phrogzと@Jared Beckが説明するように、繰り返し値のない40のランダムな値(0〜39)のうち、長さ40の配列をシャッフルすることをお勧めします。記録のためだけの別のアプローチは、ジェネレータを使用することです。しかし、このアプローチは、他の提案されたソリューションと比較してパフォーマンスに欠けています

function* generateRandomIterable(n, range) {
  for (let i = 0; i < n; i++) {
    yield ~~(Math.random() * range);
  }
}
const randomArr = [...generateRandomIterable(40,40)];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.