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

有没有一种简单的方法可以从JavaScript或任何其他编程语言的数组中进行随机选择?,javascript,arrays,random,Javascript,Arrays,Random,我正在阅读一本JavaScript初学者书籍,其中的一些代码将编码器的输入(var-answer)与数组中随机选择的字符串(answers)进行比较。这是一个猜谜游戏 我对随机选择字符串的方式感到困惑。代码似乎是将Math.random函数与answers数组及其length属性相乘。仔细检查,这似乎是从数组中进行随机选择的标准方法?你为什么要用数学运算符*,来乘法。。。出来基于数组长度的随机字符串?从技术上讲,长度不是只有3个字符串吗? 我只是觉得应该简单点 索引=答案。随机。这在JS或其他语

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

我对随机选择字符串的方式感到困惑。代码似乎是将Math.random函数与answers数组及其length属性相乘。仔细检查,这似乎是从数组中进行随机选择的标准方法?你为什么要用数学运算符*,来乘法。。。出来基于数组长度的随机字符串?从技术上讲,长度不是只有3个字符串吗? 我只是觉得应该简单点 索引=答案。随机。这在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>

var guess=“红色”;
var-answer=null;
var answers=[“红色”,
“绿色”,
“蓝色”];
var index=Math.floor(Math.random()*answers.length);
如果(猜测==答案[索引]){
答案=“是的!我在想”+答案[索引];
}否则{
答案=“不,我在想”+答案[索引];
}
警惕(回答);
用Python很容易

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

您可以使用自己的代码轻松地在Javascript中编写类似的函数,我相信有很多JS实用程序库都包含类似的函数

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

然后,您只需编写
选择(答案)
即可获得一个随机颜色。

数学。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


Math.random
和类似的函数通常返回一个介于0和1之间的数字。因此,如果将随机数乘以可能的最大值
N
,那么在Python中,将得到一个介于0和
N

之间的随机数

import random

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

流行的下划线javascript库为此提供了函数,可与python的random.choice类似使用:

给你

function randomChoice(arr) {
    return arr[Math.floor(arr.length * Math.random())];
}
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}]));
试试看

但是,如果您正在使用,上面的方法已经包括在内

let _ = require('lodash');

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

python 试试看

红宝石 使用单一数据类型

[1, 2, 3].sample
使用多种数据类型

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


更新了:添加了JavaScript示例。

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

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

不完全可能重复。user1179078已经有了答案,但想知道它为什么工作。哦,我明白了。听起来数组中的每个项实际上都是一个数字。所以我必须生成一个十进制数,乘以数组项的数字,然后四舍五入,将其转换回字符串,并将其与输入的字符串进行比较。这确实很复杂。经常忽略的一点是,Math.random可能返回0,但永远不会返回1(正如您所说,“严格小于数组的长度”)。这就是为什么它可以很好地乘以长度(长度为5,但我们需要一个介于0和4之间的数)。看到过很多例子,即使是有经验的程序员也会忘记这一点,因为这与数组索引无关,而是与其他随机整数有关。例如,使用Math.random()*10(错误)而不是11(正确)来获得0到10之间的随机整数。@nicedwar-不完全如此。数组是由整数索引的。第一个数组成员是arr[0]下一个是arr[1],以此类推,最多可达arr[arr.length-1]。您需要得到一个范围为[0,arr.length-1]的随机数,上面的算法就是这样做的。一旦得到了这个数字,您就可以用它对数组进行索引。@JimmiTh:From MDN:如果选择了非常大的边界(2^53或更高),在极少数情况下,计算通常排除的上限是可能的。我想象Python的“import random”调用类似于我在JS代码中手动编写的东西。嗯,还有其他方法可以做到这一点,但可能在某种程度上,是的。如果我必须用纯Python重写它,代码将与您的abo几乎相同这就是为什么Python在JS函数中附带了电池,你需要用
var
声明
index
。目前来看,
index
是一个全局变量。嗯,我当然不需要…:)但是同意,全局变量显然是不可取的。现在编辑。Math.random()将返回一个介于0和1之间的数字,将该数字乘以数组长度,它可能的最大值是数组长度,但是如果random不完全返回1,它将有一个小数。Math.floor()将删除该小数,如果它存在,则不执行任何其他操作。
import random
random.choice([1, 2.3, '3'])
[1, 2, 3].sample
[1, 2.34, 'a', "b c", [5, 6]].sample
classMates = ["bb", "gg", "jj", "pp", "hh"];
k = classMates.length - 0.5;
function ran(){
    p = Math.round(Math.random() * k);
    console.log(classMates[p])
}
ran()