2011-04-30 12 views

Respuesta

21
#include <stdlib.h> 

NSArray* names = ...; 
NSMutableArray* pickedNames = [NSMutableArray new]; 

int remaining = 4; 

if (names.count >= remaining) { 
    while (remaining > 0) { 
     id name = names[arc4random_uniform(names.count)]; 

     if (![pickedNames containsObject:name]) { 
      [pickedNames addObject:name]; 
      remaining--; 
     } 
    } 
} 
+0

No olvides sembrar ... –

+3

Es cierto, acabo de reemplazar rand() por arc4random() que es superior y no necesita siembra. –

+0

Gracias, funciona bien. Pero, creo que pickedNames debería ser NSMutableArray –

2

Hice un caregory llamado NSArray+RandomSelection. Sólo tiene que importar esta categoría en un proyecto, y luego sólo tiene que utilizar

NSArray *things = ... 
... 
NSArray *randomThings = [things randomSelectionWithCount:4]; 

Aquí está la aplicación:

NSArray+RandomSelection.h

@interface NSArray (RandomSelection) 
    - (NSArray *)randomSelectionWithCount:(NSUInteger)count; 
@end 

NSArray+RandomSelection.m

@implementation NSArray (RandomSelection) 

- (NSArray *)randomSelectionWithCount:(NSUInteger)count { 
    if ([self count] < count) { 
     return nil; 
    } else if ([self count] == count) { 
     return self; 
    } 

    NSMutableSet* selection = [[NSMutableSet alloc] init]; 

    while ([selection count] < count) { 
     id randomObject = [self objectAtIndex: arc4random() % [self count]]; 
     [selection addObject:randomObject]; 
    } 

    return [selection allObjects]; 
} 

@end 
+2

El manejo para la selección aleatoria más grande que el conjunto es incorrecto. Estoy usando lo siguiente en lugar de las primeras 5 líneas: 'if ([self count] miho

+0

si tiene menos de 'contar' elementos únicos en la matriz, terminará en un bucle infinito – Pieter

2

Si prefiere un marco Swift t El sombrero también tiene algunas características más prácticas. No dudes en pagar HandySwift. Puede añadirlo a su proyecto a través de Cartago luego usarlo como esto:

import HandySwift  

let names = ["Harry", "Hermione", "Ron", "Albus", "Severus"] 
names.sample() // => "Hermione" 

También hay una opción para obtener múltiples elementos al azar a la vez:

names.sample(size: 3) // => ["Ron", "Albus", "Harry"] 

Espero que esto ayude !

+0

Esto no responde la pregunta ya que necesita mostrar cómo se puede usar la lista de números aleatorios para seleccione los nombres en la matriz grande para crear la matriz de nombres elegidos. – Droppy

+1

Parece que mi respuesta fue engañosa. Lo he actualizado para usar una matriz de nombres como ejemplo en lugar de una matriz de números. Funciona igual, solo un tipo diferente de Array. Espero que esté claro ahora. – Dschee

Cuestiones relacionadas