例如:一个数组中有四个项目。我想随机得到一个,像这样:
array items = [
"bike" //40% chance to select
"car" //30% chance to select
"boat" //15% chance to select
"train" //10% chance to select
"plane" //5% chance to select
]
Run Code Online (Sandbox Code Playgroud) 可以设想对冒泡排序进行修改,其中“交换”以概率随机发生p,而不是通过执行比较。结果可以称为“泡沫洗牌”。靠近前面的元素可能会保留在那里,但有机会移到列表的后面。
修改从互联网上窃取的冒泡排序,您可以想出以下内容:
import random
def bubble_shuffle(arr, p):
arr = copy.copy(arr)
n = len(arr)
# Traverse through all array elements
for i in range(n-1):
# range(n) also work but outer loop will repeat one time more than needed.
# Last i elements are already in place
for j in range(0, n-i-1):
# traverse the array from 0 to n-i-1
# Swap if random number [0, 1] is less than p
if random.random() < p:
arr[j], arr[j+1] = arr[j+1], arr[j] …Run Code Online (Sandbox Code Playgroud) 使用嵌套数组中的权重对一个或多个数组进行混洗的好算法是什么?
例子:
$array = array(
array("name"=>"John", "rank"=>3),
array("name"=>"Bob", "rank"=>1),
array("name"=>"Todd", "rank"=>8),
array("name"=>"Todd", "rank"=>14),
array("name"=>"Todd", "rank"=>4)
);
Run Code Online (Sandbox Code Playgroud)
我希望数组随机打乱,但我希望该rank值是一个权重。因此,那些数字排名较低的人更有可能位于列表的顶部。
我已经尝试了一些事情,比如遍历数组并提取使用的数组,mt_rand(mt_rand(0,$value),$value)但我认为我没有走在正确的轨道上......
有一个包含 ID 和这些 ID 的权重的哈希值。
y = { 1 => 0.7, 2 => 0.2, 3 => 0.1 }
Run Code Online (Sandbox Code Playgroud)
我想根据权重对这个哈希值进行洗牌。
我尝试了多种不同的方法,所有这些都给我带来了相似的、意想不到的结果。这是我发现的最简洁的。
y.sort_by {|v| -v[1]*rand()}
Run Code Online (Sandbox Code Playgroud)
当我运行此一万次并选出第一个 ID 时,我得到以下计数:
{1=>8444, 2=>1316, 3=>240}
Run Code Online (Sandbox Code Playgroud)
我希望这些计数能够反映上面的权重(例如1=> 7000)。我有点不清楚为什么这种洗牌与这些权重不匹配。有人可以消除我的困惑并告诉我如何解决它吗?
以下是我发现的一些有用的来源: