Objective-C中的随机数

时间:2011-08-09 09:18:25

标签: ios objective-c random

  

可能重复:
  Generating random numbers in Objective-C
  iOS Random Numbers in a range
  Generate non-repeating, no sequential numbers

我正在寻找能给出两个数字之间随机数的方法,第一个数字是我在数字之间选择的数字。

例如,如果我给这个随机函数5和10和9作为第一个数字,那么它会给我:9,10,7,6,5,8

我试图使用它:

NSUInteger count = [array count];
for (NSUInteger i = 1; i < count; ++i) {
        int nElements = count - i;
    int n = (random() % nElements) + i;
    while (n==`firstnumber`) {
        n = (random() % nElements) + i;
    }
}

2 个答案:

答案 0 :(得分:4)

int r = arc4random() % 9 + 5会为您提供5到13之间的数字,包括两者。

答案 1 :(得分:3)

  

第一个数字由我设定,其他数字由方法设定,和   每个号码只显示一次

看起来你正在使用一个改组算法。 NSMutableArray上的以下类别将完成此任务:

@interface NSMutableArray (Shuffling)
- (void)shuffle;
@end

@implementation NSMutableArray (Shuffling)

- (void)shuffle
{
    // Fisher–Yates shuffle (modern algorithm)
    // To shuffle an array a of n elements (indexes 0..n-1):
    // for i from n − 1 downto 1 do
    //     j <-- random integer with 0 <= j <= i
    //     exchange a[j] and a[i]
    // http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

    for (int i = [self count] - 1; i >= 1; i--) {
        int j = arc4random() % (i + 1);
        [self exchangeObjectAtIndex:j withObjectAtIndex:i];
    }
}

@end

您的要求是数组第一个位置的数字是固定的(由您给出)。然后,你可以这样做:

  1. 使用minValuemaxValue之间的所有数字(包括两者)填充数组,但firstValue除外。

  2. 随机播放阵列。

  3. firstValue插入数组的第一个位置。

  4. 导致以下代码:

    NSInteger minValue = 5;
    NSInteger maxValue = 10;
    NSInteger firstValue = 9;
    
    // minValue <= firstValue <= maxValue
    
    // populate the array with all numbers between minValue 
    // and maxValue (both included) except for firstValue
    NSMutableArray *ary = [NSMutableArray array];
    for (int i = minValue; i < firstValue; i++) {
        [ary addObject:[NSNumber numberWithInt:i]];
    }
    for (int i = firstValue + 1; i <= maxValue; i++) {
        [ary addObject:[NSNumber numberWithInt:i]];
    }
    // --> (5,6,7,8,10)
    // shuffle the array using the category method above
    [ary shuffle];
    // insert firstValue at the first position in the array
    [ary insertObject:[NSNumber numberWithInt:firstValue] atIndex:0];
    // --> (9,x,x,x,x,x)