Answers:
这是一个简单的单线
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']);
如果您需要随机获取多个项目,则可以在下划线中将其作为第二个参数传递:
// 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)
如果您有固定值(例如月份名称列表)并且想要单行解决方案
var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]
数组的第二部分是访问操作,如JavaScript为什么[5,6,8,7] [1,2] = 8中所述?
最短的版本:
var myArray = ['January', 'February', 'March'];
var rand = myArray[(Math.random() * myArray.length) | 0]
| 0
办?
Math.floor
但这是正确的做法。它是一个运算符,因此它的运行速度比Math.floor
仅因为在运行代码的任何时候都可以Math.floor = someOtherFunction
并且它们不能对'|'做相同的情况下要快。在另一方面,作为Math.floor
和|
是不同的尝试Math.floor(-1.5)
VS -1.5 | 0
。顺便说一下,您不需要括号。|
优先级很低。
如果要像Pascual的解决方案一样将其写在一行上,另一种解决方案是使用ES6的find函数来编写它(基于以下事实:从n
项目中随机选择一个的概率为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
从中选择随机数组元素的实际方法。
编辑数组原型可能是有害的。这是完成这项工作的简单功能。
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];
创建一个随机值并传递给数组
请尝试以下代码。
//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(...))
呼叫,它会四舍五入。