在不从javascript中的数组进行替换的情况下,获取随机样本的一种干净方法是什么?所以假设有一个数组
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
我想随机采样5个唯一值;例如,生成一个长度为5的随机子集。要生成一个随机样本,可以执行以下操作:
x[Math.floor(Math.random()*x.length)];
但是,如果多次执行此操作,则可能会多次捕获同一项。
我建议使用Fisher-Yates混洗混洗数组的副本并进行切片:
function getRandomSubarray(arr, size) {
var shuffled = arr.slice(0), i = arr.length, temp, index;
while (i--) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(0, size);
}
var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var fiveRandomMembers = getRandomSubarray(x, 5);
请注意,这不是获取大型数组的随机小子集的最有效方法,因为它会不必要地对整个数组进行洗牌。为了获得更好的性能,您可以执行部分改组:
function getRandomSubarray(arr, size) {
var shuffled = arr.slice(0), i = arr.length, min = i - size, temp, index;
while (i-- > min) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(min);
}
Reference 关于乱序(shuffle)与随机采样(sample)的一点探究 - xybaby - 博客园 洗牌算法 Fisher–Yates shuffle - Wikipedia Knuth-Durstenfeld Shuffle(Fisher–Yates Shuffle 改进版) Knuth-Durstenfeld Shuffle 是一个“原地”(in-place)算法 伪代码 To
根据RandomizedSearchCV文件(重点是mine): param_distributions:字典或字典列表 使用参数名称 (str) 作为键的字典,以及要尝试的分布或参数列表。分布必须提供 rvs 方法进行采样(例如来自 scipy.stats.分布的方法)。如果给出了一个列表,则对其进行统一采样。如果给出了字典列表,则首先对字典进行统一采样,然后如上所述使用该字典对参数进行采样。
问题内容: 该模块(http://docs.python.org/2/library/random.html)具有几个 固定 功能,可以从中随机采样。例如,将从具有给定均值和sigma值的正态分布中采样随机点。 我正在寻找一种方法,该方法可以使用自己的分布 尽可能快地 在给定间隔内提取一定数量的随机样本。这就是我的意思: 这里是我后和是从中可以得出样本的限制。有这样的东西吗? 问题答案: 您需要使
问题内容: 如何在numpy中以[a,b]间隔采样随机浮点数?不仅是整数,而且是任何实数。例如, 将在之间返回随机数。谢谢。 问题答案: 该均匀分布可能会做你的要求。
问题内容: $items = Array(523,3452,334,31,…5346); 此数组的每个项目都是一个数字。 如何获得随机物品? 问题答案: echo $items[array_rand($items)]; array_rand()
问题内容: 我有两个相关的numpy数组和。我需要从中选择随机行,并将其存储在数组中,并将其对应的值附加到随机选择的点的索引上。 我有另一个数组,它存储我不想采样的索引列表。 我怎样才能做到这一点? 样本数据: 如果这些是随机选择的(其中): 所需的输出将是: 我怎样才能做到这一点? 问题答案: 您可以使用以下方法创建随机索引: 然后,您只需要使用结果索引数组: