【发布时间】:2015-07-05 09:04:02
【问题描述】:
我有一套物品。我需要随机选择一个。问题是它们每个的权重为 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)];
这需要我检查 $a 中的每个项目,并为数组使用 $a 内存的 max_weight/2*size。我想要一个完全不同的算法。
此外,我在半夜用手机问了这个问题。在手机上输入代码几乎是不可能的,因为那些愚蠢的虚拟键盘简直糟透了。它会自动更正所有内容,破坏我输入的任何代码。
更进一步,我今天早上醒来时发现了一种全新的算法,它完全不使用虚拟内存,也不需要检查数组中的每一项。我将其作为答案发布在下面。
【问题讨论】:
-
请发布您的代码
-
大量内存?你一般有多少物品?
-
平均案例大约是 100,000 个项目,平均重量为 5。这意味着我每次想随机选择一个项目时都会创建一个 500.000 个元素的数组。
-
将项目保留在数据库中,当您随机选择一项时,仅将那一项从数据库中拉出。这样你就不需要数组中的项目了。
标签: php