2013-11-20 67 views
0

即使我再次執行下面的代碼&我得到相同的輸出。但是,我認爲它不應該:爲什麼Rand()總是生成固定唯一組數的隨機數?

int ObjectCount =500; 
NSMutableArray *mut_arr = [[NSMutableArray alloc]initWithCapacity:0]; 
for (int i = 0; i<ObjectCount ; i++) 
{  
[mut_arr addObject:[NSNumber numberWithInt: rand()%ObjectCount]]; 
} 
NSSet* uniqueSet = [NSSet setWithArray:mut_arr];  
NSLog(@"Array of %d objects generates %d Unique Objects",[mut_arr count],[uniqueSet count]); 

輸出如下:

陣列500

對象產生317個唯一對象

這裏,因爲數組包含隨機數的一套獨特的計數應對於相同的ObjectCount,再次相同&。

+2

請參閱:http://stackoverflow.com/questions/3322603/how-do-i-seed-the-random-generator-and-create-a-random-int-in-objective-c – doctorlove

回答

3

您實際上並不產生獨特NSNumber對象;其中一些是平等的。

A NSArray可以包含多個相等的對象。 A NSSet不能。這就是爲什麼從你的數組創建的集合有更少的對象。

你之所以總是給我317分的對象是你使用rand()沒有播種:Why do I always get the same sequence of random numbers with rand()?

考慮使用arc4random()相反,它是自動播種。

+0

謝謝,你能否提出一些堅實的見解,說明爲什麼當建議使用arc4random()或種子更新時,爲什麼它始終生成315到325之間的唯一集值的數字? – itechnician

+0

@技術人員這與生成重複值的概率有關。你基本上告訴應用程序給你500個0到499之間的隨機整數。其中一些必然是重複的。另見:http://en.wikipedia.org/wiki/Birthday_problem –

1

使用這樣

[mut_arr addObject:[NSNumber numberWithInt:(arc4random() % (ObjectCount-1) + 1)]]; 
+0

arc4random is幾乎總是矯枉過正,而不需要解決這個問題。此外:應該使用IFF,然後使用arc4random_uniform(u_int32_t upper_bound)而不是'arc4random()%(ObjectCount-1)' – CouchDeveloper

+0

你可以提出一些堅實的見解:爲什麼當建議arc4random時,它總是生成315到325之間的唯一集值)還是使用種子更新? – itechnician