it-swarm.com.de

Erstellen eines Arrays der Länge n mit Zufallszahlen in JavaScript

Nach dieser Antwort zum Erstellen eines Arrays mit der angegebenen Länge führte ich das folgende aus, um ein entsprechendes Ergebnis zu erhalten, das jedoch mit Zufallszahlen anstelle von Nullen gefüllt war.

var randoms = Array(4).fill(Math.floor(Math.random() * 9));

Nun, mathematisch gesehen es ist zufällig alles in Ordnung. Aber ich möchte, dass die Zufälligkeit innerhalb des Arrays und nicht nur zwischen den Läufen sichtbar ist. Dummer Computer ... Tu nicht was ich sage. Tu was ich will!

Ich kann meine zufälligen (und variierenden) Werte wiederholen. Aber ich frage mich aus reiner Neugier, ob es möglich ist, mit einem Einzeiler, wie oben, im MatLab-Stil, das richtige Ergebnis zu erzielen. Muss ich eval (function () ...) aufrufen? Ich habe viele schlechte Dinge über eval gehört ...

Beachten Sie, dass der obige Code folgendermaßen erzeugt wird:

[7, 7, 7, 7]
[3, 3, 3, 3]

etc. während ich sowas will

[1, 2, 3, 4]
[4, 3, 8, 4]

14

Was macht Array#fill ?

Laut MDN

Die fill() -Methode füllt alle Elemente eines Arrays von einem Startindex bis zu einem Endindex mit einem statischen Wert.

Sie können Function#apply , Array#map , Math.floor() , Math.random() .

In ES6 können Array#from und Pfeilfunktion verwendet werden.

Array.from({length: 6}, () => Math.floor(Math.random() * 9));

Array.apply(null, Array(6)).map(() => Math.floor(Math.random() * 9));

var randomArr = Array.from({length: 6}, () => Math.floor(Math.random() * 9));

document.getElementById('result').innerHTML = JSON.stringify(randomArr, 0, 4); // For demo only
<pre id="result"></pre>

In ES5:

Array.apply(null, Array(6)).map(function(item, index){
    return Math.floor(Math.random() * 9);
});
var randomArr = Array.apply(null, Array(6)).map(function(item, index){
    return Math.floor(Math.random() * 9)
});

document.getElementById('result').innerHTML = JSON.stringify(randomArr, 0, 4);
<pre id="result"></pre>

Was ist Array.apply(null, Array(n))? Kann new Array(n) hier verwendet werden?

Mit dem obigen Code wird ein neues Array mit sechs Elementen erstellt, wobei jedes Element den Wert undefined hat. Bei Verwendung der new -Syntax kann das erstellte Array jedoch nicht iteriert werden. Um das Array iterabel zu machen, wird die Syntax Array.apply(null, Array(6)) verwendet.


Wenn Sie lodash auf Seite enthalten haben, ist es wirklich einfach.

_.times(6, _.random.bind(0, 100))
        ^                        - Number of elements in array
                         ^       - Random number range min
                            ^^^  - Random number range max

Hinweis: Diese Antwort ist inspiriert von Colin Tohs Blog

21
Tushar
var randoms = Array(4).fill(Math.floor(Math.random() * 9));

In dieser Codezeile wird eine Liste von 4 derselben Nummer erstellt, da fill einen einzelnen Wert annimmt und ihn für die Länge der Liste wiederholt. Sie möchten den Zufallszahlengenerator jedes Mal ausführen:

var makeARandomNumber = function(){
    return Math.floor(Math.random() * 9);
}
var randoms = Array(5).fill(0).map(makeARandomNumber);
console.log(randoms)
// => [4, 4, 3, 2, 6]

https://jsfiddle.net/t4jtjcde/

6
Conrad.Dean

Kurzer und einfacher ES6-Ansatz

// randomly generated n = 4 length array 0 <= array[n] <= 9
var randoms = Array.from({length: 4}, () => Math.floor(Math.random() * 10));

Genießen!

3
simonbor

Ich frage mich, ob es möglich ist, mit einem Einzeiler das richtige Ergebnis zu erzielen ...

var randoms = [...Array(4)].map(虚 => Math.floor(Math.random() * 9));

document.body.innerText = randoms;

1
7vujy0f0hy

`const t = Array.from ({Länge: n}, mapArrowFx);

1) const t10 = Array.from({length: 10}, (v, k) => k); [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2) const tEven = Array.from({length: 10}, (v, k) => 2*k); [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

........

3)

let n=100; const tRandom= Array.from({length: n}, (v, k) => Math.floor(Math.random()*n)); 

...

0
user3008938

Lösung aus Größeres Array von zufälligen eindeutigen Zahlen

const uniqRandomNumbers  = _.sampleSize(_.range(9), 4);
console.log(uniqRandomNumbers);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
0
Ramzan Chasygov