小编kai*_*naw的帖子

加权随机选择

我有一套物品。我需要随机挑选一个。问题是它们每个的权重都是1-10。权重为 2 意味着该商品被挑选的可能性是权重为 1 的两倍。权重为 3 则意味着该商品被挑选的可能性是权重的三倍。

我目前用每个项目填充一个数组。如果权重为 3,我将该项目的三个副本放入数组中。然后,我随机选择一个项目。

我的方法速度很快,但占用大量内存。我试图想出一种更快的方法,但什么也没想到。有人有解决这个问题的窍门吗?

编辑:我的代码...

显然,我没说清楚。我不想使用(或改进)我的代码。这就是我所做的。

//Given an array $a where $a[0] is an item name and $a[1] is the weight from 1 to 100.
$b = array();
foreach($a as $t)
    $b = array_merge($b, array_fill(0,$t[1],$t));
$item = $b[array_rand($b)];
Run Code Online (Sandbox Code Playgroud)

这要求我检查 $a 中的每个项目,并为数组使用 $a 内存的 max_weight/2*size 。我想要一个完全不同的算法。

此外,我在半夜用电话问了这个问题。在手机上输入代码几乎是不可能的,因为那些愚蠢的虚拟键盘简直太糟糕了。它会自动更正所有内容,破坏我输入的任何代码。

此外,我今天早上醒来时发现了一种全新的算法,该算法几乎不使用任何额外的内存,并且不需要检查数组中的每个项目。我将其作为答案发布在下面。

php

4
推荐指数
1
解决办法
4175
查看次数

标签 统计

php ×1