非常新手 obj-c 问题。
在 ViewController 我有四个 UIImages。他们在模仿扑克牌。用户在开始时只能看到他们的背面。通过点击其中一个,用户将看到正面(现在已经准备好动画)。我的任务是从四个具有定义重复率的图像中显示随机正面。所以我想设置其中一张图片(奖品)的出现次数比获得其他任何一张的机会少八倍,每次用户访问这个 ViewController 时。
如果可能的话,请给我看一段可以随机生成但可以设置重复率的代码
非常新手 obj-c 问题。
在 ViewController 我有四个 UIImages。他们在模仿扑克牌。用户在开始时只能看到他们的背面。通过点击其中一个,用户将看到正面(现在已经准备好动画)。我的任务是从四个具有定义重复率的图像中显示随机正面。所以我想设置其中一张图片(奖品)的出现次数比获得其他任何一张的机会少八倍,每次用户访问这个 ViewController 时。
如果可能的话,请给我看一段可以随机生成但可以设置重复率的代码
- (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;
}
}];
}
}
也许我使用 WDUC 的答案是错误的,但我没有用这种方法得到正确的结果,正如我在对他的回答中所写的那样。我有一个不同的方法,它在概念上与我提到的思想实验相同——也就是说,如果你将你的奖品图像放入一个数组中,然后将其他 3 个图像中的每一个放入一个数组 8 次,那么你将选择奖品图像比其他任何人少 8 倍。但是,要实现这一点,您可以让随机数生成器从一组等于该假设数组的计数(在本例中为 25)的数字中选择,然后使用模运算符来获取正确的索引。
如果您有一个包含 4 个图像的数组,奖品图像是最后一个,则此方法应该选择最后一个索引(在这种情况下为 3)比其他 3 个中的任何一个少 8 倍(我为 numOfItems 传递 4,为 probFactor 传递 8对于你的例子):
-(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;
}
}