4

我目前正在使用以下代码从数组中获取随机元素。我将如何更改代码,以便它返回一个按我希望它出现的百分比加权的元素?例如,我希望索引 0 处的元素出现 27.4% 的时间,但索引 7 处的元素仅出现 5.9% 的时间。

NSArray *quoteArray = @[    @"quote1",    @"quote2",    @"quote3",    @"quote4",    @"quote5",    @"quote6",    @"quote7",    @"quote8",    ];    

NSString *quoteString;

int r = arc4random() % [quoteArray count];
if(r<[rewardTypeArray count])
    quoteString = [quoteArray objectAtIndex:r];
4

3 回答 3

6

我会使用一个浮点数组(包裹在 NSNumber 中)对象。

每个对象代表一个百分比。在这种情况下,您将拥有一个包含 8 个对象的数组:

对象 1:@27.5;

...

对象 7:@5.9。

然后你得到一个从1到100的随机数。如果你想要更高的精度,你也可以得到一个小数部分的随机数,精度不影响效率,也不影响使用的内存。

然后,当您获得遍历所有数组的数字时,跟踪索引和您拥有的百分比。您使用浮点数来汇总所有满足的百分比,并且仅当总百分比大于等于您拥有的百分比时才停止。

例子

NSArray* percentages= @[ @27.4 , ... , @5.9];
float randomNumber= arc4random_uniform(100) + (float)arc4random_uniform(101)/100;  
NSUInteger n=0;
float totalPercentage= 0.0;
for(NSUInteger i=0; i<percentages.count; i++)
{
    totalPercentage+= [ percentages[i] floatValue ];
    if( totalPercentage >= randomNumber)  // This case we don't care about
                                          // the comparison precision
    {
        break;
    }
    n++;
}
// Now n is index that you want
于 2013-01-03T17:05:48.997 回答
4

最简单的方法是根据您希望百分比的细粒度生成一个随机数。要计算到百分之十分之一,您可以生成 0-1000 之间的值,并且您可以随机生成的 274 个值将是第一个元素。59 个值对应于元素 7。

例如:

0-273    = index 1 27.4%
274-301  = index 2 2.7%
302-503  = index 3 20.1%
504-550  = index 4 4.6%
551-700  = index 5 14.9%
701-941  = index 6 24%
942-1000 = index 7 5.9%

百分比加起来不正确,所以我在某处做错了数学,但你明白了。

于 2013-01-03T16:42:00.753 回答
0

您可以使用计数器创建另一个数组,该数组将持续跟踪每个元素的生成次数。如果该计数器小于您的目标,则让该索引进入您的 r,否则重新生成。

于 2013-01-03T16:42:08.907 回答