我想从数组中随机选择一个元素,但每个元素都有一个已知的选择概率.
所有机会在一起(在阵列中)总和为1.
您认为哪种算法最快,最适合大型计算?
例:
id => chance
array[
0 => 0.8
1 => 0.2
]
Run Code Online (Sandbox Code Playgroud)
对于这个伪代码,所讨论的算法应该在多个调用上统计地返回id上0的一个元素的id 上的四个元素1.
我知道如何在PHP中生成一个随机数,但是我想要一个介于1-10之间的随机数,但我想要更多的3,4,5,然后是8,9,10.这怎么可能?我会发布我尝试的但老实说,我甚至不知道从哪里开始.
我知道如何从数组中选择一个随机项,但是如何从一个数组中选择十个随机项,比方说二十个项?(在PHP中.)
更复杂的是每个项目实际上有两个部分:文件名和描述.基本上,它是一个网页,每次重新加载时将显示十个随机图像.这些数据的实际格式并不重要,尽管它很简单,我宁愿将其包含在平面文本中,甚至是硬编码,而不是设置数据库.(这也不是经常改变的.)
奖金问题,不确定我是否会这样做 - 但是你如何对参赛作品进行加权,以便某些项目总是被选中,或者至少比其他项目更频繁?
谢谢.
我有一套物品。我需要随机挑选一个。问题是它们每个的权重都是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 。我想要一个完全不同的算法。
此外,我在半夜用电话问了这个问题。在手机上输入代码几乎是不可能的,因为那些愚蠢的虚拟键盘简直太糟糕了。它会自动更正所有内容,破坏我输入的任何代码。
此外,我今天早上醒来时发现了一种全新的算法,该算法几乎不使用任何额外的内存,并且不需要检查数组中的每个项目。我将其作为答案发布在下面。