我对编码很陌生,我一直在寻找类似的问题,但没有一个符合我的需求。我正在使用骰子滚动应用程序,我需要一个随机数生成器来滚动"滚动"骰子。 arc4random似乎很完美,但是我不能连续两次出现同样的问题。当我按下带有计时器的按钮时,我有一个触发方法
- (IBAction)dieRoll:(id)sender {
self.currentFace = 1;
_timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(roll) userInfo:nil repeats:YES];;
}
但我必须实施' roll'方法,我得到一个与已经选择的随机数不同的随机数(属性self.currentFace)。
任何线索?
答案 0 :(得分:4)
这就是您的实施方式:
@interface ViewController ()
@property (assign, nonatomic) NSInteger currentFace;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.currentFace = -1;
}
- (IBAction)diceRoll:(id)sender {
NSInteger newFace = -1;
do {
newFace = arc4random_uniform(6) + 1;
} while (newFace == self.currentFace);
self.currentFace = newFace;
}
@end
答案 1 :(得分:1)
一个简单的解决方案就是记住最后一个掷骰数并掷骰子直到得到另一个骰子。很简单,你可以保持arc4random。
一个例子:
- (NSUInteger)rollDiceWithLastFaceNumber:(NSUInteger)lastFaceNumber
{
NSUInteger currentFaceNumber;
do {
currentFaceNumber = (arc4random_uniform(6) + 1);
} while (currentFaceNumber == lastFaceNumber);
return currentFaceNumber;
}
以及如何使用它:
[self rollDiceWithLastFaceNumber:3];
答案 2 :(得分:1)
此解决方案避免了未知数量的迭代,直到您得到结果。
- (void)roll {
NSUInteger next = [self nextFaceWithPreviousFace:self.currentFace];
NSLog(@"%lu", next);
self.currentFace = next;
}
- (NSUInteger)nextFaceWithPreviousFace:(NSUInteger)previous {
NSMutableArray *candidates = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, nil];
[candidates removeObject:@(previous)];
NSUInteger index = arc4random_uniform((unsigned)candidates.count);
return [candidates[index] unsignedIntegerValue];
}