說我有一個包含對象的數組,1,2,3和4. 如何從這個數組中選取一個隨機對象?在NSArray中選取一個隨機對象
回答
@達里爾的答案是正確的,但可以使用一些小的調整:
NSUInteger randomIndex = arc4random() % [theArray count];
修改:
- 使用
arc4random()
超過rand()
和random()
是簡單,因爲它不需要播種(呼叫srand()
或srandom()
)。 - modulo operator(
%
)使總體語句更短,同時也使語義更清晰。 theArray.count
是錯誤的。它將起作用,但count
未在NSArray
上聲明爲@property
,因此應通過點語法調用而不是。它的作用只是編譯器如何解釋點語法的副作用。
請注意,RC4/ARC4不提供統一的輸出。 – 2010-07-23 15:01:20
「theArray.count是錯誤的,它可以工作,但count並沒有在NSArray上聲明爲@property,因此不應該通過點語法來調用。」 ---這是不正確的。點語法和聲明的屬性實際上並沒有關聯:你可以在沒有參數的方法上使用點語法而根本沒有問題。 – 2012-02-14 17:00:06
從arc4random手冊頁:arc4random_uniform()被推薦用於類似'arc4random()%upper_bound''的結構,因爲當上限不是2的冪時,它避免了「模偏置」。 – 2012-06-15 01:12:36
生成一個隨機數並將其用作索引。例如:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSArray *array = [NSArray arrayWithObjects: @"one", @"two", @"three", @"four", nil];
NSUInteger randomNumber;
int fd = open("/dev/random", O_RDONLY);
if (fd != -1) {
read(fd, &randomNumber, sizeof(randomNumber));
close(fd);
} else {
fprintf(stderr, "Unable to open /dev/random: %s\n", strerror(errno));
return -1;
}
double scaledRandomNumber = ((double)randomNumber)/NSUIntegerMax * [array count];
NSUInteger randomIndex = (NSUInteger)floor(scaledRandomNumber);
NSLog(@"random element: %@", [array objectAtIndex: randomIndex]);
}
return 0;
}
也許東西沿着線:
NSUInteger randomIndex = (NSUInteger)floor(random()/RAND_MAX * [theArray count]);
不要忘了初始化隨機數發生器(srandomdev(),例如)。
注意:根據以下答案,我已更新爲使用-count而不是點語法。
srand([[NSDate date] timeIntervalSince1970]);
int inx =rand()%[array count];
inx是隨機數。
其中srand()可以在隨機選取函數之前的程序中的任何地方。
這是我能想出的最簡單的辦法:
id object = array.count == 0 ? nil : array[arc4random_uniform(array.count)];
因此,有必要檢查count
因爲非nil
但空NSArray
將返回0
爲count
,並arc4random_uniform(0)
回報0
。所以沒有檢查,你會超出陣列的界限。
該解決方案是誘人的,但錯誤,因爲它會導致一個空數組崩潰:
id object = array[arc4random_uniform(array.count)];
僅供參考,這裏的documentation:
u_int32_t
arc4random_uniform(u_int32_t upper_bound);
arc4random_uniform() will return a uniformly distributed random number less than upper_bound.
手冊頁沒有按」當0
作爲upper_bound
傳遞時,請提及arc4random_uniform
返回0
。
此外,arc4random_uniform
在<stdlib.h>
中定義,但在我的iOS測試程序中添加#import
不是必需的。
@interface NSArray<ObjectType> (Random)
- (nullable ObjectType)randomObject;
@end
@implementation NSArray (Random)
- (nullable id)randomObject
{
id randomObject = [self count] ? self[arc4random_uniform((u_int32_t)[self count])] : nil;
return randomObject;
}
@end
編輯:更新了Xcode的7仿製藥,爲空
ObjectType *objectVarName = [array objectAtIndex:arc4random_uniform((int)(array.count - 1))];
如果要強制轉換成int類型,下面是當你需要從一個隨機的int作爲該解決方案(有用非順序編號的數組,在隨機化枚舉呼叫的情況下,等等)
int intVarName = (int)[(NSNumber *)[array objectAtIndex:arc4random_uniform((int)(array.count - 1))] integerValue];
在夫特4:
let array = ["one","two","three","four"]
let randomNumber = arc4random_uniform(UInt32(array.count))
array[Int(randomNumber)]
請複習[我如何寫出一個好答案](https://stackoverflow.com/help/how-to-answer)。不接受代碼的答案是不鼓勵的,因爲他們沒有解釋他們如何解決問題中的問題。你應該更新你的答案,以解釋這是什麼以及它如何改善這個7歲的問題已經有的許多答案 – FluffyKitten 2017-10-12 21:28:21
- 1. 在NSArray中取一些對象並將它隨機放在標籤中
- 2. java隨機選擇一個類/對象
- 3. 隨機選擇一個對象
- 4. Db4o選擇隨機對象
- 5. 隨機選擇的對象 -
- 6. 如何在隨機選擇的對象內創建一個隨機屬性?
- 7. 從nsarray獲得n個隨機對象(例如4)
- 8. 從列表中隨機選擇一個對象(圖像)
- 9. 從JavaScript對象中隨機選擇值
- 10. 我想顯示一個隨機對象
- 11. 如何生成一個隨機對象?
- 12. 從數組中獲取隨機對象
- 13. 從Vector中讀取隨機對象java
- 14. 從ArrayList中抓取隨機對象不是隨機的
- 15. 的Javascript選擇陣列設置一個隨機對象
- 16. 如何隨機選擇一個對象鍵?
- 17. 分選物體的一個NSArray WRT在這些對象
- 18. 使用NSFetchedResultsController來獲取一個隨機對象
- 19. 從5個對象之一隨機獲取數據
- 20. 如何在laravel 5.4中隨機選擇一個來自數據庫的對象?
- 21. 如何讓相機在opengl中跟隨一個3d對象?
- 22. 在factory_girl定義中指定一個隨機關聯對象
- 23. Android隨機對象
- 24. 選擇對象ID的隨機數?
- 25. 隨機選擇對象的算法
- 26. 隨機類 - 將對象分配給另一個對象
- 27. 隨機4x4 2D NSArray Objective-C
- 28. 如何隨機化NSArray?
- 29. 在NSArray中搜索對象
- 30. 如何在二維數組中選取一個隨機元素
這裏的所有答案都是正確的,但對於更新的解決方案,請參閱我的答案[here](http://stackoverflow.com/a/10837462/730701)。它使用'arc4random_uniform'方法來避免模偏差。 – Adam 2013-05-28 21:57:58