有没有一种简单的方法可以在JavaScript或任何其他编程语言中从数组中进行随机选择?

时间:2012-01-30 22:12:09

标签: javascript arrays random

我正在阅读初学者的JavaScript书籍,其中包含一些代码,用于将编码器的输入(var answer)与从数组中随机选择的字符串(答案)进行比较。这是一个猜谜游戏。

我对随机选择字符串的方式感到困惑。代码似乎是将Math.random函数乘以answers数组及其length属性。检查周围,这似乎是从数组中随机选择的标准方法?你为什么要使用数学运算符*来乘以......一个基于数组长度的随机字符串?技术上长度不是只有3个字符串吗? 我觉得它应该是简单的东西 index = answers.random。这是否存在于JS或其他语言中?

<script>

var guess = "red";
var answer = null;

var answers = [ "red",
"green",
"blue"];

var index = Math.floor(Math.random() * answers.length);

if (guess == answers[index]) {
answer = "Yes! I was thinking " + answers[index];
} else {
answer = "No. I was thinking " + answers[index];
}
alert(answer);

</script>

9 个答案:

答案 0 :(得分:31)

在Python中很容易。

>>> import random
>>> random.choice(['red','green','blue'])
'green'

您正在查看的代码如此常见的原因通常是,当您在统计中讨论随机变量时,它的范围为[0,1)。如果您愿意,可以将其视为百分比。要使此百分比适合选择随机元素,请将其乘以范围,允许新值介于[0,RANGE]之间。 Math.floor()确保该数字是一个整数,因为当用作数组中的索引时,小数没有意义。

您可以使用您的代码在Javascript中轻松编写类似的函数,我确信有很多JS实用程序库包含一个。像

这样的东西
function choose(choices) {
  var index = Math.floor(Math.random() * choices.length);
  return choices[index];
}

然后你可以简单地写choose(answers)来获得随机颜色。

答案 1 :(得分:20)

Math.random为您提供0到1之间的随机数。

将此值乘以数组的长度将得到一个严格小于数组长度的数字。

上调用Math.floor 会截断小数,并在数组的范围内给出一个随机数

var arr = [1, 2, 3, 4, 5];
//array length = 5;

var rand = Math.random();
//rand = 0.78;
rand *= arr.length; //(5)
//rand = 3.9
rand = Math.floor(rand);
//rand = 3

var arr = [1, 2, 3, 4, 5];
//array length = 5;

var rand = Math.random();
//rand = 0.9999;
rand *= arr.length; //(5)
//rand = 4.9995
rand = Math.floor(rand);
//rand = 4 - safely within the bounds of your array

答案 2 :(得分:13)

你去吧

function randomChoice(arr) {
    return arr[Math.floor(arr.length * Math.random())];
}

答案 3 :(得分:2)

流行的Underscore javascript库为此提供了功能,可以使用类似于python的random.choice:

http://underscorejs.org/#sample

var random_sample = _.sample([1, 2, 3, 4, 5, 6]);

答案 4 :(得分:1)

Math.random和类似函数通常返回0到1之间的数字。因此,如果将随机数乘以最高可能值N,则最终会得到一个随机数0和N

答案 5 :(得分:1)

在Python中它是......

import random

a=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'etc.']
print random.choice(a)

答案 6 :(得分:1)

var choiceIndex = Math.floor(Math.random() * yourArray.length)

答案 7 :(得分:0)

我测试了每个元素的不同可能性,这更好,因为每个元素都有相同的可能性:

classMates = ["bb", "gg", "jj", "pp", "hh"];
k = classMates.length - 0.5;
function ran(){
    p = Math.round(Math.random() * k);
    console.log(classMates[p])
}
ran()

答案 8 :(得分:-2)

的JavaScript

没有。 Vanilla JS不提供以下任何方法。不幸的是,你必须计算。

function sample(array) {
  return array[Math.floor(Math.random() * array.length)];
}

console.log(sample([1, 2, 3]));
console.log(sample([11, 22.3, "33", {"a": 44}]));

尝试here

但是,如果您使用lodash,则已涵盖上述方法。

let _ = require('lodash');

console.log(_.sample([11, 22.3, "33", {"a": 44}]));

尝试here

的Python

import random
random.choice([1, 2.3, '3'])

尝试here

红宝石

使用单一数据类型

[1, 2, 3].sample

使用多种数据类型

[1, 2.34, 'a', "b c", [5, 6]].sample

尝试here

已更新:已添加JavaScript示例。