2011-04-30 12 views
11

से एन यादृच्छिक वस्तुओं (उदाहरण के लिए 4) प्राप्त करें मेरे पास नामों का एक बड़ा एनएसएआरआरई है, मुझे उस सरणी से यादृच्छिक 4 रिकॉर्ड (नाम) प्राप्त करने की आवश्यकता है, मैं यह कैसे कर सकता हूं?nsarray

उत्तर

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

बीज को मत भूलना ... –

+3

सच है, मैंने बस arc4random() द्वारा रैंड() को प्रतिस्थापित किया है जो बेहतर है और बीजिंग की आवश्यकता नहीं है। –

+0

धन्यवाद, यह ठीक काम करता है। लेकिन, मुझे लगता है कि उठाए गए नाम एनएसएमयूटेबलएरे –

2

मैंने NSArray+RandomSelection नामक एक देखभाल की।

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

यादृच्छिक चयन के लिए हैंडलिंग बड़े पैमाने पर सरणी गलत है। मैं पहली 5 लाइनों के बजाय निम्नलिखित का उपयोग कर रहा हूं: 'अगर ([आत्म गिनती] <गिनती) { गिनती = [स्वयं गिनती]; } ' – miho

+0

यदि आपके पास सरणी में अद्वितीय तत्वों की गणना नहीं है, तो आप अंत में और अंतहीन पाश – Pieter

2

आप एक स्विफ्ट फ्रेमवर्क पसंद करते हैं: बस एक परियोजना में इस श्रेणी आयात करते हैं, और फिर बस

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

यहाँ का उपयोग कार्यान्वयन है टी टोपी में कुछ और आसान विशेषताएं भी चेकआउट HandySwift के लिए स्वतंत्र महसूस करती हैं। इसके बाद आप कार्थेज के माध्यम से अपनी परियोजना में जोड़ सकते हैं इस तरह इसका इस्तेमाल:

import HandySwift  

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

वहाँ भी एक बार पर कई यादृच्छिक तत्वों प्राप्त करने के लिए एक विकल्प है:

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

मुझे आशा है कि इस मदद करता है !

+0

समाप्त कर देंगे, यह प्रश्न का उत्तर नहीं देता है क्योंकि आपको यह दिखाने की आवश्यकता है कि यादृच्छिक संख्याओं की सूची का उपयोग कैसे किया जा सकता है उठाए गए नाम सरणी बनाने के लिए बड़े सरणी में नामों का चयन करें। – Droppy

+1

ऐसा लगता है कि मेरा जवाब भ्रामक था। मैंने इसे संख्या सरणी के बजाय एक नाम सरणी का उपयोग करने के लिए अद्यतन किया है। वही काम करता है, सिर्फ एक अलग प्रकार का ऐरे। मुझे आशा है कि यह अभी स्पष्ट है। – Dschee