Проблема рандомизации числа в Objective-C - PullRequest
3 голосов
/ 27 февраля 2011

Я пытаюсь сгенерировать случайное число от 0 до размера моего массива:

    float randomNum = (rand() / RAND_MAX) * [items count];
    NSLog(@"%f",randomNum);
    NSLog(@"%d",[items count]);

randomNum всегда равно 0,0000000

Ответы [ 6 ]

6 голосов
/ 27 февраля 2011

randomNum всегда равно 0,0000000

Это потому, что вы делаете целочисленное деление вместо деления с плавающей точкой; (rand() / RAND_MAX) почти всегда будет 0. (Упражнение для читателя: когда не 0?)

Вот один из способов исправить это:

float randomNum = ((float)rand() / (float)RAND_MAX) * [items count];

Вы должны также использовать arc4random .

5 голосов
/ 27 февраля 2011

Попробуйте вместо этого:

int randomNum = arc4random() % ([items count] +1);

обратите внимание, что randomNum не будет использоваться в качестве ссылки на массив.Для этого вам нужно:

int randomRef = arc4random() % [items count];
id myRandomObject = [myArray objectAtIndex:randomRef];

arc4random() возвращает u_int32_t (int), что делает его легко переносимым на такие вещи, как игральные кости, массивы и другие реальные проблемы в отличие от rand()

2 голосов
/ 27 февраля 2011

Если вы хотите, чтобы оно было между 0 и размером вашего массива, оно должно быть:

randomNum = random() % [items count];  // between 0 and arraySize-1


Если вы хотите, чтобы ваш размер массива включался:

randomNum = random() % ([items count]+1);  // between 0 and arraySize
1 голос
/ 27 февраля 2011

люди говорят, что arc4random () - лучший метод rnd ...

Вы можете использовать его таким образом, чтобы получить число в диапазоне:

int fromNumber = 0;
int toNumber = 50;
float randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
NSLog(@"random number is:  %f",randomNumber); // you'll get from 0 to 49

...

int fromNumber = 12;
int toNumber = 101;
float randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
NSLog(@"random number is:  %f",randomNumber); // you'll get from 12 to 100
1 голос
/ 27 февраля 2011

Попробуйте rand() * [items count];

IIRC, rand() возвращает значения от 0 до 1.

0 голосов
/ 27 февраля 2011

Прежде чем использовать rand (), вы должны установить начальное число, для этого необходимо вызвать функцию srand и передать начальное число.

См. здесь для документации srand и здесь для ранда.

...