-1

重複の可能性:
Objective-C での乱数の生成

こんにちは、にきびを押すとビュー内のランダムな場所に移動するアプリを作成しています。にきびはUIImageViewです。ここに私が入れたコードがあります:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *myTouch = [touches anyObject];

    CGPoint point = [myTouch locationInView:pimple];
    if ( CGRectContainsPoint(pimple.bounds, point) ) {
        [self checkcollision];
    }
}

-(void)checkcollision 
{

    pimple.center = CGPointMake(random(), random());    
    sad.hidden = NO;    
    NSURL* popURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"pop" ofType:@"mp3"]];
    AudioServicesCreateSystemSoundID((CFURLRef) popURL, &popID);
    AudioServicesPlaySystemSound(popID);
}

このコード: pimple.center = CGPointMake(random(), random()); 動作しません。ニキビを押すとニキビが消えます。にきびの .hidden は何も述べていないので、それは動いていることを意味するに違いありません。しかし、あなたはそれを見ることができません (ビューの外にあります)。私のコードに何か問題がありますか? 何か不足していますか?助けてください。

4

1 に答える 1

2

私の知る限り、random() は c の rand() とまったく同じです。

0 から RAND_MAX の範囲の疑似乱数の整数を返します。[...] RAND_MAX は cstdlib で定義されている定数です。デフォルト値は実装によって異なる場合がありますが、少なくとも 32767 であることが認められています。

その結果、ピンプルをウィンドウよりもはるかに大きい四角形内のランダムな位置に移動します。これを試してください: (self は UIView であると仮定します)

pimple.center = CGPointMake(
    random() % (unsigned int)self.bounds.size.width, 
    random() % (unsigned int)self.bounds.size.height);

%-Operator はModulo-Operatorです。

各スタートアップで常に同じ軌道につながる疑似ランダムジェネレーターをシードしていないようです。random()/rand() の代わりに arc4random を使用するように指示する別のスレッドが stackoverflowにあります。

于 2011-05-30T09:23:51.603 に答える