2013-06-05 5 views
-1

мне нужно для генерации случайных чисел из массива я попытался это внутри для циклагенерации случайных чисел из NSMutable массива

rnd = arc4random_uniform(arr.count); 

она породила случайных чисел, но некоторые цифры получить повторяется также пытались Random() в math.h по-прежнему сохраняется проблема, пожалуйста, помогите мне. Заранее спасибо ..

+0

Вы пробовали 'INT R = arc4random()% 5;', как если вы хотите '0 'в' 4'? – Buntylm

+0

Конечно, будут повторения, потому что они генерируются «случайно». Если бы для генерации был образец, то он не был бы назван случайным справа? –

+0

Вы имеете в виду, что вам нужно почувствовать массив по уникальным номерам в случайном порядке? Еще один код может помочь получить вашу идею – voromax

ответ

0

Вы можете использовать следующую функцию.

@property (nonatomic,strong) NSMutableArray * numbers; 


- (NSInteger) nonRepeatedNumber 
{ 

    if(_numbers == nil) 
    { 
     _numbers = [[NSMutableArray alloc]init]; 
    } 

    NSInteger number = arc4random()% arr.count; 
    while ([_numbers containsObject:[NSNumber numberWithInt:number]]) 
    { 
     number = arc4random()% arr.count;; 
    } 
    [_numbers addObject:[NSNumber numberWithInt:number]]; 

    return number; 
} 
+0

Это работает, но только до достижения «maxValue» случайных чисел, поэтому это невозможно использовать бесконечно. – pasawaya

+0

@qegal невозможно проследить уникальные бесконечные случайные числа! Но OP требует уникальных случайных значений для определенного диапазона, как указано. –

+0

это не сработает повторяющееся значение, сгенерированное .. Я пробовал это – Jitendra

0
#include <stdlib.h> 


int r = 0; 
if (arc4random_uniform != NULL) 
    r = arc4random_uniform (arr.count); 
else 
    r = (arc4random() % arr.count); 

int randomNumberFromArray=[arr objectAtIndex:r]; 

EDIT

Bingo.After некоторые мысли я сделал это работает

-(NSArray *)randomizeArray:(NSArray *)inputArray 
{ 
    NSMutableArray *checkArray=[[NSMutableArray alloc]initWithCapacity:3]; 
    NSMutableArray *outputArray=[[NSMutableArray alloc]initWithCapacity:3]; 

    while ([outputArray count]<[inputArray count]) 
    { 
     int r=[self getRandomNumber:[inputArray count]]; 
     if ([checkArray containsObject:[NSNumber numberWithInt:r]]) 
     { 


     } 
     else 
     { 
      [checkArray addObject:[NSNumber numberWithInt:r]]; 
      [outputArray addObject:[inputArray objectAtIndex:r]]; 
     } 
    } 
    return outputArray; 
} 


-(int)getRandomNumber:(int)maxValue 
{ 
    int r = 0; 
    if (arc4random_uniform != NULL) 
     r = arc4random_uniform (maxValue); 
    else 
     r = (arc4random() % maxValue); 
    return r; 
} 

Этот randomizeArray: метод даст вам целый ряд рандомизированных

+0

получить только одно значение из массива .... – Jitendra

+0

? Отредактировано ответ –

+0

@JitendraDeore Теперь он отлично работает. Испытано –

2

если я понял

«Мне нужно для генерации случайных чисел из массива»

правильно, вы хотите цифры должны быть взяты из массива случайным образом, если да, то первого магазина цифрами, в NSMutableArray

NSMutableArray *arr=//store your numbers in this array. 

-(void)getRandomNumberFromArray:(NSMutableArray *)arr{ 
int r = arc4random() % arr.count; 
int number=[arr objectAtIndex:r]; 
[arr removeObjectAtIndex:r]; 
} 
0

Попробуйте следующий метод

-(NSMutableArray*)randomNumbersfromArray:(NSArray*)array { 
     NSArray *numbers = array; 
     int count = [numbers count]; 
     NSMutableArray *addedIndexes = [[NSMutableArray alloc]initWithCapacity:count]; 
     NSMutableArray *addedObjects = [[NSMutableArray alloc]initWithCapacity:count]; 
     int i = 0; 
     while ([addedIndexes count] != [numbers count]) { 

      int random = arc4random() % count ; 
      if (![addedIndexes containsObject:[NSString stringWithFormat:@"%i",random]]) { 

       [addedIndexes addObject:[NSString stringWithFormat:@"%i",random]]; 
       [addedObjects addObject:[numbers objectAtIndex:random]]; 
       i++; 
      } 

     } 
     return addedObjects; 
    } 
1

Генерирует случайное число для каждого элемента, а затем проверить, чтобы убедиться, что это не то же самое, как один из существующих. Если он уже существует, повторите попытку.

for(int i = 0; i < arr.count;i++) 
{ 
    BOOL isRandom = YES; 
    int rand = -1; 
    while(!isRandom) 
    (
    isRandom = YES; 
    rand = arc4random() % 5; 
    for(int j = 0; j < i; j++) 
    { 
     int existingNumber = arr[j]; 
     if(existingNumber == rand) 
     { 
      isRandom = NO; 
      break; 
     } 
    } 
    } 
    arr[i] = rand; 
} 

Другим вариантом является первым просто присвоить их, чтобы иметь Приращение значения, а затем перетасовать изменяемый массив. What's the Best Way to Shuffle an NSMutableArray?

1

Если я понял вашу проблему, то вам не нужны случайные числа, вам нужно перетасовать элементы в массиве?

Тогда вам нужно использовать этот метод,

-(void)shuffleWithArray:(NSArray*)cardsArray 
{ 

    NSMutableArray *shuffleArray =[[NSMutableArray alloc]initWithArray:cardsArray]; 


    // NSUInteger count1=[shuffleArray count]; 
    for (NSUInteger i= 0; i<[shuffleArray count]; i++) 
    { 

    int nElement=[shuffleArray count] -i; 
    int n=(arc4random()%nElement + i); 
    [shuffleArray exchangeObjectAtIndex:i withObjectAtIndex:n]; 

    } 

} 
Смежные вопросы