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

Posted

技术标签:

【中文标题】有没有一种简单的方法可以从 JavaScript 或任何其他编程语言中的数组中进行随机选择?【英文标题】:Is there a simple way to make a random selection from an array in JavaScript or any other programming language? 【发布时间】:2012-02-22 16:50:30 【问题描述】:

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

我对随机选择字符串的方式感到困惑。该代码似乎将 Math.random 函数乘以 answers 数组及其长度属性。检查一下,这似乎是从数组中随机选择的标准方法?为什么要使用数学运算符 * 来乘... 出... 基于数组长度的随机字符串?从技术上讲,长度不是只有 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>

【问题讨论】:

Getting random value from an array的可能重复 不完全是。 user1179078 已经有了答案,但想知道它为什么有效。 【参考方案1】:

在 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)来获得随机颜色。

【讨论】:

我想 Python 的 'import random' 调用类似于我在 JS 代码中手动编写的内容。 嗯,还有其他方法可以做到这一点,但可能在某种程度上,是的。如果我必须用纯 Python 重写它,代码将与您上面的代码几乎相同。 这就是 Python 自带电池的原因 在JS函数中需要声明indexvar。就目前而言,index 是一个全局变量。 嗯,我当然不需要... :) 但同意,全局变量显然是不可取的。立即编辑。【参考方案2】:

Math.random 给你一个介于 0 和 1 之间的随机数。

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

that 上调用 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

【讨论】:

哦,我明白了。听起来数组中的每个项目实际上都是一个数字。所以我必须生成一个小数,将其乘以数组项的数字,然后将其四舍五入,将其转换回字符串并将其与输入的字符串进行比较。这肯定很复杂。 经常被忽略的一点是,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:来自 MDN:如果选择了极大的界限(2^53 或更高),则在极少数情况下可以计算通常排除的上限。 【参考方案3】:

给你

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

【讨论】:

Math.random() 将返回一个介于 0 和 1 之间的数字,将该数字乘以数组长度,最大的可能是数组长度,但是如果 random 没有,它将有一个小数' 不完全返回 1。如果存在,Math.floor() 将删除该小数,否则不执行任何操作。【参考方案4】:

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

http://underscorejs.org/#sample

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

【讨论】:

【参考方案5】:

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 示例。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:
var choiceIndex = Math.floor(Math.random() * yourArray.length)

【讨论】:

【参考方案8】:

在 Python 中是...

import random

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

【讨论】:

【参考方案9】:

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

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

ran()

【讨论】:

以上是关于有没有一种简单的方法可以从 JavaScript 或任何其他编程语言中的数组中进行随机选择?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以在 JavaScript 中将文本转换为 HTML? [复制]

有没有一种快速的方法可以从 WebGL / Javascript 中的几个帧缓冲区中获取平均颜色?

有没有一种简单的方法可以从本地 gradle 缓存中删除一个依赖项?

JavaScript - 有没有一种简单的方法来获取嵌套 JSON 中每次出现的特定键的值

有没有一种简单的方法可以从 CakePHP 的视图中获取 AuthComponent 用户数据?

有没有一种简单的方法可以从布尔表达式中从 pandas DataFrame 中提取行?