随机出现的 UIImage

Posted

技术标签:

【中文标题】随机出现的 UIImage【英文标题】:Random UIImage appearing 【发布时间】:2012-12-10 16:32:02 【问题描述】:

非常新手 obj-c 问题。

在 ViewController 我有四个 UIImages。他们在模仿扑克牌。用户在开始时只能看到他们的背面。通过点击其中一个,用户将看到正面(现在已经准备好动画)。我的任务是从四个具有定义重复率的图像中显示随机正面。所以我想设置其中一张图片(奖品)的出现次数比获得其他任何一张的机会少八倍,每次用户访问此 ViewController 时。

如果可能,请告诉我一段代码可以生成随机但可以设置重复率

【问题讨论】:

你试过什么?如果您可以显示一些代码,帮助您可能会更容易,因此我们知道您正在使用什么。 mattgemmell.com/2008/12/08/what-have-you-tried 感谢您的关注,propstm!目前什么都没有,主要想法是在我将随机生成的内容中制作单例,并从四个图像的 NSArray 加载 UIImage,但我完全不知道如何制作它。对不起,我是个新手 你的意思是比其他 3 个加起来少 8 倍,还是比获得其他任何一个的机会少 8 倍? 你需要更清楚你想要的选择过程。您的意思是每 8 次选择,奖品肯定会被选择一次,或者它被选择的概率是其他人的 8 倍。 (基本上每8个选择,概率为1,或者0.04^8)? 获得其他任何一个的机会的八倍 【参考方案1】:
- (NSUInteger)indexForImageGivenIndexSet:(NSIndexSet*)indexSet             // Set of indexes you want to select from
                         prizeImageIndex:(NSUInteger)prizeIndex      // The prize index
                        probabilityScale:(CGFloat)probabilityScale   // The scale for the prize (8.0 for 8x less than the others)

    // If invalid, return what was given
    if (![indexSet containsIndex:prizeIndex]) 
        return prizeIndex;
    

    // Calculate our probabilities
    // For a set of 4, with a scale of 8 on the prize, our probabilities would be
    // 0.04 (prize), 0.32, 0.32, 0.32
    double prizeProbability = (1.0 / indexSet.count) * (1.0 / probabilityScale);

    double val = (double)arc4random() / RAND_MAX;

    if (val < prizeProbability) 
        return prizeIndex;
    
    else 
        // Select from the others in range equally
        NSMutableIndexSet* newSet = [[NSMutableIndexSet alloc] initWithIndexSet:indexSet];
        [newSet removeIndex:prizeIndex];

        NSInteger selectedPosition = arc4random() % newSet.count;
        __block NSInteger count = 0;
        return [newSet indexPassingTest:^BOOL(NSUInteger idx, BOOL *stop) 
            if (count == selectedPosition) 
                *stop = YES;
                return YES;
            
            else 
                count++;
                return NO;
            
        ];
    

【讨论】:

WDUK,我没有太多的统计背景,但是如果你有一个数组,其中代表奖品的项目在那里一次,其他每张图片都代表 8,你会得到相同的结果吗?次,然后使用 array[arc4_random(25)] 选择一个项目? 这也可以,但从算法的角度来看,并不是特别可扩展。想象一下,必须从 250 个项目中进行选择,其中一个项目的规模为 50。您的数组大小为 12451。为什么要为简单的概率选择任务浪费这么多内存。 谢谢,我将其用作思想实验,而不是可能的编码解决方案。我不确定如何使用您的方法-对于 OP 的示例,您是否会传递一个包含 4 个索引和 8 个概率尺度的索引集?如果我这样做,并运行该方法一百万次,我只会得到大约 15,600 次的奖品指数,而不是我预期的 40,000 次。【参考方案2】:

也许我使用 WDUC 的答案是错误的,但我没有用这种方法得到正确的结果,正如我在对他的回答的回复中所写的那样。我有一个不同的方法,它在概念上与我提到的思想实验相同——也就是说,如果你将你的奖品图像放入一个数组中,然后将其他 3 个图像中的每一个放入 8 次,那么你将选择奖品图像比其他任何人少 8 倍。但是,要实现这一点,您可以让随机数生成器从一组等于该假设数组的计数(在本例中为 25)的数字中选择,然后使用模运算符来获取正确的索引。

如果您有一个包含 4 个图像的数组,奖品图像是最后一个,则此方法应该选择最后一个索引(在这种情况下为 3 个)比其他 3 个中的任何一个少 8 倍(我为 numOfItems 和8 为您的示例的 probFactor):

-(int)indexOfSelectionFromItems:(int) numOfItems timesLessPicked:(int) probFactor 
    int size = (numOfItems - 1) * probFactor + 1;
    int pick = arc4random_uniform(size);
    if (pick != size-1) 
        return (pick % (numOfItems - 1));
    else
        return numOfItems -1;
    

【讨论】:

以上是关于随机出现的 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

IOS - UIImage

随机逗号出现在数组 ReactJS

随机出现的 UIImage

随机出现的 gzip 标头

随机模块中的数字是不是有相同的机会出现或不出现? [复制]

glColor 不起作用,出现随机颜色