如何创建一个包含40个元素的数组,随机值从0到39? 像
[4, 23, 7, 39, 19, 0, 9, 14 ...]
我尝试使用此处的解决方案:
http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm
但我获得的数组很少随机。它产生了许多连续数字的块......
答案 0 :(得分:102)
最短的方法(ES6)
// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));
享受!
答案 1 :(得分:36)
这是一个解决方案,可以随机播放唯一号码列表(无需重复)。
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想要的那样),那么看看其他地方。 :)
答案 2 :(得分:36)
ES5:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Anaconda3>python.exe
Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar 6 2015, 12:06:10) [MSC v.1
600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyglet #No problem!
>>> pyglet.image.ImageData #Heavy CPU load until I exit python
<class 'pyglet.image.ImageData'>
ES6:
for dest in A62PD{R,S,L,X,Y}_BLACK.png
do
cp A62PD_BLACK.png "${dest}"
done
答案 3 :(得分:20)
更短的ES6方法:
Array(40).fill().map(() => Math.round(Math.random() * 40))
此外,您可以使用带参数的函数:
const randomArray = (length, max) =>
Array(length).fill().map(() => Math.round(Math.random() * max))
答案 4 :(得分:14)
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);
答案 5 :(得分:10)
..我得到的数组很少随机。它产生了许多连续数字的块......
随机项的序列通常包含连续数字的块,请参阅Gambler's Fallacy。例如:
..我们刚刚连续扔了四个头。因为概率 一连串五个连续的头只有1/32 ..一个人受到了 赌徒的谬误可能会让人觉得下一次翻转的可能性更小 是头,而不是尾巴。 http://en.wikipedia.org/wiki/Gamblers_fallacy
答案 6 :(得分:8)
最短的:-)
[...Array(40)].map(e=>~~(Math.random()*40))
答案 7 :(得分:3)
每天推出Quirk单线解决方案。
数组中的值是完全随机的,因此当您使用此片段时,它会有所不同。
一个数组(长度为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']
一个数组(长度为10),随机整数从0到99
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
答案 8 :(得分:3)
由于数字范围受到限制,我要说最好的事情是生成数组,用数字0到39填充(按顺序),然后将其洗牌。
答案 9 :(得分:2)
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
答案 10 :(得分:1)
只需两行代码即可生成包含 10 个随机数的数组。
let result = new Array(10)
result = result.fill(0).map(() => Math.random());
而且只是。
console.log(vals);
答案 11 :(得分: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);
请注意,此解决方案仅适用于支持这些ES6功能的现代浏览器:箭头函数和Array.from()。
答案 12 :(得分:1)
let randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));
将数组限制为6个值,以便于查看。
答案 13 :(得分:1)
请参阅以下内容:-
let arr = Array.apply(null, {length: 1000}).map(Function.call, Math.random)
/* will create array with 1000 elements */
答案 14 :(得分: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]
答案 15 :(得分:0)
由于*
的优先级高于|
,因此可以使用|0
替换Math.floor()
来缩短优先级。
[...Array(40)].map(e=>Math.random()*40|0)
答案 16 :(得分:0)
这是一个ES6函数,它允许一个最小值和一个最大值,并将以随机顺序生成一个唯一值数组,其中包含从最小值到最大值(包括端值)的所有数字:
const createRandomNumbers = (min, max) => {
const randomNumbers = new Set()
const range = max - min + 1
while (randomNumbers.size < range) {
randomNumbers.add(~~(Math.random() * range))
}
return [...randomNumbers]
}
答案 17 :(得分:0)
如@Phrogz和@Jared Beck所解释的,长度为40的数组,其中包含40个可能的随机值(0-39),无需重复值,最好将其改组。 仅用于记录的另一种方法可能是使用生成器。但是与其他提议的解决方案相比,这种方法缺乏性能。
function* generateRandomIterable(n, range) {
for (let i = 0; i < n; i++) {
yield ~~(Math.random() * range);
}
}
const randomArr = [...generateRandomIterable(40,40)];
答案 18 :(得分:0)
聚会晚了一点,但是我使用randojs.com来保证随机性,因为它使像这样的事情变得非常容易。您可以像这样从0到39随机抽取一组数字:
console.log(randoSequence(40));
<script src="https://randojs.com/1.0.0.js"></script>
无需大惊小怪,而且它具有超强的可读性和易懂性:)
答案 19 :(得分:0)
我很确定这是创建随机数组而不重复的最短方法
var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5);
答案 20 :(得分: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 } );
答案 21 :(得分: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
}
我想这种方法可以解决概率问题,只受随机数生成器的限制。
答案 22 :(得分: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;
}
我宁愿不创建一个循环,有可能最终得到很多不必要的调用(如果你的数量和范围很高并且接近相同的数字)但这是我能来的最好的起来。