[英]iOS: How do I generate 8 unique random integers?
我需要生成 8 個隨機整數,但它們必須是唯一的,也就是不重復。
例如,我想要 1 到 8 范圍內的 8 個數字。
我看過 arc4random 但我不確定如何讓它們獨一無二?
解決方案
-(NSMutableArray *)getRandomInts:(int)amount from:(int)fromInt to:(int)toInt {
if ((toInt - fromInt) +1 < amount) {
return nil;
}
NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
int r;
while ([uniqueNumbers count] < amount) {
r = (arc4random() % toInt) + fromInt;
if (![uniqueNumbers containsObject:[NSNumber numberWithInt:r]]) {
[uniqueNumbers addObject:[NSNumber numberWithInt:r]];
}
}
return uniqueNumbers;
}
-(NSMutableArray *)getEightRandom {
NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
int r;
while ([uniqueNumbers count] < 8) {
r = arc4random();
if (![uniqueNumbers containsObject:[NSNumber numberWithInt:r]]) {
[uniqueNumbers addObject:[NSNumber numberWithInt:r]];
}
}
return uniqueNumbers;
}
如果您想限制小於某個閾值 M 的數字,那么您可以通過以下方式執行此操作:
-(NSMutableArray *)getEightRandomLessThan:(int)M {
NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
int r;
while ([uniqueNumbers count] < 8) {
r = arc4random() % M; // ADD 1 TO GET NUMBERS BETWEEN 1 AND M RATHER THAN 0 and M-1
if (![uniqueNumbers containsObject:[NSNumber numberWithInt:r]]) {
[uniqueNumbers addObject:[NSNumber numberWithInt:r]];
}
}
return uniqueNumbers;
}
如果 M=8,或者即使 M 接近 8(例如 9 或 10),那么這需要一段時間,您可以更聰明。
-(NSMutableArray *)getEightRandomLessThan:(int)M {
NSMutableArray *listOfNumbers = [[NSMutableArray alloc] init];
for (int i=0 ; i<M ; ++i) {
[listOfNumbers addObject:[NSNumber numberWithInt:i]]; // ADD 1 TO GET NUMBERS BETWEEN 1 AND M RATHER THAN 0 and M-1
}
NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
int r;
while ([uniqueNumbers count] < 8) {
r = arc4random() % [listOfNumbers count];
if (![uniqueNumbers containsObject:[listOfNumbers objectAtIndex:r]]) {
[uniqueNumbers addObject:[listOfNumbers objectAtIndex:r]];
}
}
[listOfNumbers release];
return uniqueNumbers;
}
唯一性是您需要提供的東西——隨機性 API 不會為您做到這一點。
正如建議的那樣,您可以生成一個數字,然后檢查它是否與您已經生成的內容發生沖突,如果是,請嘗試 agin。 但是請注意,根據數字的數量和范圍的大小,這將成為一種沒有保證終點的算法。
如果您真的只是想以隨機順序獲取一組連續的數字,那么這不是一種方法,因為它可能需要很長時間才能完成。 在這種情況下,首先構建一個包含所有所需值的數組,然后“改組”該數組是更好的選擇。 最好的洗牌是Fisher-Yates ,但如果您不需要它完全不偏不倚,您也可以執行此處描述的操作。
檢查已經生成的數字可能很昂貴(理論上,它可能需要很長時間。)但是,這是一個已解決的問題。 你想要一個洗牌算法,比如Fisher-Yates_shuffle
在 iOS 上可能類似於:
NSMutableArray *randSequence = [[NSMutableArray alloc] initWithCapacity:8];
for (int ii = 1; ii < 9; ++ii)
[randSequence addObject:[NSNumber numberWithInt:ii]];
for (int ii = 8; ii > 0; --ii) {
int r = arc4random() % (ii + 1);
[randSequence exchangeObjectAtIndex:ii withObjectAtIndex:r];
// you can now iterate over the numbers in `randSequence` to get
// your sequence in random order
將數字存儲在一個數組中,每次生成下一個時 - 檢查它是否已經存在於數組中。 如果沒有,則添加並繼續。
這是一些偽代碼
allKeys
方法)試試這個代碼......這將為您提供在可變數組中設置的所有可能的唯一數字......
-(NSInteger) randomNumber {
NSInteger newRandomNumber = (NSInteger) arc4random() % 10;
NSInteger uniqueNumber;
if ([self.arrayContainingNumbers containsObject: [NSNumber numberWithInteger:newRandomNumber]]) {
[self randomNumber];
} else {
[self.arrayContainingNumbers addObject: [NSNumber numberWithInteger:newRandomNumber]];
}
uniqueNumber = [[self.mutableArrayContainingNumbers lastObject]integerValue];
NSLog(@"new Unique Number is %ld",(long)uniqueNumber);
return uniqueNumber;
}
不要忘記添加此方法:)
-(NSMutableArray *) arrayContainingNumbers {
if (!_mutableArrayContainingNumbers) {
_mutableArrayContainingNumbers = [[NSMutableArray alloc] init];
}
return _mutableArrayContainingNumbers;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.