随机出现的 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的主要内容,如果未能解决你的问题,请参考以下文章