객체 1, 2, 3 및 4 가있는 배열이 있다고 가정 해 보겠습니다.
이 배열에서 임의의 객체를 어떻게 선택합니까?
답변
@Darryl의 대답은 정확하지만 약간의 조정을 사용할 수 있습니다.
NSUInteger randomIndex = arc4random() % theArray.count;
수정 :
arc4random()
overrand()
and 사용random()
은 시드 (srand()
또는 호출srandom()
)가 필요하지 않기 때문에 더 간단합니다 .- 모듈로 연산자는 (
%
또한 의미 명확하면서), 전체 문 짧은합니다.
답변
이것이 제가 생각해 낼 수있는 가장 간단한 해결책입니다.
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)];
참고로 다음은 문서입니다 .
u_int32_t
arc4random_uniform(u_int32_t upper_bound);
arc4random_uniform() will return a uniformly distributed random number less than upper_bound.
남자 페이지는 언급하지 않는 arc4random_uniform
반환 0
하는 경우 0
로 전달됩니다 upper_bound
.
또한에 arc4random_uniform
정의되어 <stdlib.h>
있지만 #import
iOS 테스트 프로그램 에서는을 추가 할 필요가 없습니다.
답변
아마도 다음과 같은 내용 일 것입니다.
NSUInteger randomIndex = (NSUInteger)floor(random()/RAND_MAX * [theArray count]);
난수 생성기 (예 : srandomdev ())를 초기화하는 것을 잊지 마십시오.
참고 : 아래 답변에 따라 점 구문 대신 -count를 사용하도록 업데이트했습니다.
답변
@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에 대해 업데이트되었습니다. Generics, nullability
답변
난수를 생성하여 색인으로 사용합니다. 예:
#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;
}
답변
srand([[NSDate date] timeIntervalSince1970]);
int inx =rand()%[array count];
inx는 난수입니다.
여기서 srand ()는 임의 선택 함수 이전에 프로그램의 어느 위치 에나있을 수 있습니다.
답변
ObjectType *objectVarName = [array objectAtIndex:arc4random_uniform((int)(array.count - 1))];
그것을 int로 캐스트하고 싶다면 여기에 대한 해결책이 있습니다 (열거 호출을 무작위 화하는 경우 등 비 순차적 숫자 배열에서 임의의 정수가 필요할 때 유용합니다)
int intVarName = (int)[(NSNumber *)[array objectAtIndex:arc4random_uniform((int)(array.count - 1))] integerValue];