2

我正在尝试随机化数组中的数字。我可以使用arc4random() % [indexes count]

我的问题是 - 如果一个数组由 20 个项目组成,那么每次数组洗牌时,在一批 5 中,应该出现不同的数字。例子 :

第一次洗牌:1,4,2,5,6。

第二次洗牌:7,12,9,15,3

-(IBAction)randomNumbers:(UIButton *)sender
{
    int length = 10; // int length = [yourArray count];

    NSMutableArray *indexes = [[NSMutableArray alloc] initWithCapacity:length];
    for (int i=0; i<5; i++)
        [indexes addObject:[NSNumber numberWithInt:i]];

    NSMutableArray *shuffle = [[NSMutableArray alloc] initWithCapacity:length];

    while ([indexes count])
    {
        int index = arc4random() % [indexes count];
        [shuffle addObject:[indexes objectAtIndex:index]];
        [indexes removeObjectAtIndex:index];
    }

    //    for (int i=0; i<[shuffle count]; i++)
    NSLog(@"%@", [shuffle description]);
}
4

4 回答 4

2

根据您的要求....请检查此代码

将此作为属性

@synthesize alreadyGeneratedNumbers;

在您的 .m 中添加这些方法

-(int)generateRandomNumber{

    int TOTAL_NUMBER=20;

    int low_bound = 0;
    int high_bound = TOTAL_NUMBER;
    int width = high_bound - low_bound;
    int randomNumber = low_bound + arc4random() % width;

    return randomNumber;
}


-(IBAction)randomNumbers:(UIButton *)sender
{

    NSMutableArray *shuffle = [[NSMutableArray alloc] initWithCapacity:5];

    BOOL contains=YES;
    while ([shuffle count]<5) {
        NSNumber *generatedNumber=[NSNumber numberWithInt:[self generateRandomNumber]];
        //NSLog(@"->%@",generatedNumber);

        if (![alreadyGeneratedNumbers containsObject:generatedNumber]) {
            [shuffle addObject:generatedNumber];
            contains=NO;
            [alreadyGeneratedNumbers addObject:generatedNumber];
        }
    }

    NSLog(@"shuffle %@",shuffle);
    NSLog(@"Next Batch");


    if ([alreadyGeneratedNumbers count] >= TOTAL_NUMBER) {
        NSLog(@"\nGame over, Want to play once again?");//or similar kind of thing.
        [alreadyGeneratedNumbers removeAllObjects];
    }


}

我仍然觉得你需要一些改变,比如

它会给你正确的值,但如果用户按了第 5 次呢?

在 20 个号码中,您已经选择了 4 组 5 个号码,在第 6 次它将循环搜索下一组号码,并且将变为无限。

所以你可以做的是,跟踪随机播放,一旦达到限制,即 20/5=4 禁用随机按钮。

于 2012-11-30T06:41:14.683 回答
1

这个对我有用:

    NSMutableArray *numbers = [NSMutableArray new];
    BOOL addElement = YES;
    int limit = 100; // Range from 0 to 36
    int numElem = 10; // Number of elements
    do
    {
        int ranNum = (arc4random() % limit) +1;
        if ([numbers count] < numElem) {
            for (NSNumber *oneNumber in numbers) {
                addElement =([oneNumber intValue] != ranNum) ? YES:NO;
                if (!addElement) break;
            }
            if (addElement) [numbers addObject:[NSNumber numberWithInt:ranNum]];
        } else {
            break;
        }
    } while (1);
    NSLog(@"%@",numbers);
于 2013-12-30T13:37:58.610 回答
1

在扩展名或头文件中声明包含已生成数字的数组

@property (strong, nonatomic)NSMutableArray *existingNums;
@property (assign, nonatomic)NSInteger maxLimit;
@property (assign, nonatomic)NSInteger minLimit;

然后在实现文件中实现给定的代码

@synthesize existingNums;
@synthesize maxLimit;
@synthesize minLimit;

- (NSInteger)randomNumber {

    if(!existingNums)
        existingNums = [NSMutableArray array];

    while (YES) {

        NSNumber *randonNum = [NSNumber numberWithInteger:minLimit+arc4random()%maxLimit];

        if([existingNums containsObject:randonNum]) {

            if([existingNums count] == (maxLimit - minLimit))
                return -1; // All possible numbers generated in the given range

            continue;
        }

        [existingNums addObject:randonNum];

        return [randonNum integerValue];
    }

    return -1;   // return error
}

希望对你有帮助 :)

于 2013-04-28T20:14:21.567 回答
0

所有这些答案的问题在于,您需要查看之前生成的随机数,如果您需要大量随机整数,则需要额外的时间。

另一种解决方案是使用密码学:

  1. 生成随机密钥
  2. 在 0..n 之间迭代
  3. 对每个整数进行加密,然后将要使用的备选方案的数量取模应用于函数的输出。

有一些额外的细节需要考虑,这些细节对您的情况无关紧要。

于 2013-12-30T13:54:45.840 回答