Новичок генератор случайных чисел в вопросе C? - PullRequest
2 голосов
/ 28 июля 2011
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, const char *argv[]) {
    srand(clock());
    int num = rand() % 6 + 1;

    printf("%i", num);
    return 0;
}

Я получаю это предупреждение в "srand (clock ());"линия.

Предупреждение. Неявное преобразование теряет целочисленную точность: от 'clock_t' (он же «unsigned long») до «unsigned int»

Как это исправить?Спасибо!

Ответы [ 4 ]

8 голосов
/ 28 июля 2011

Не используйте srand (часы ()), используйте srand ((без знака) время (NULL)) вместо .

Лучше семена:

  • Используйте время (NULL), чтобы получить время дня и привести результат к семени. srand ().

  • time (NULL) возвращает количество секунд, прошедших с полуночи 1 января 1970 г.

  • Используйте rdtsc (), чтобы получить метку времени процессора и привести результат к начальному значению. srand (). rdtsc () вряд ли вернет повторяющиеся значения, так как возвращает количество инструкций
    выполняется процессором с момента запуска.

Вы также должны прочитать эту статью на US-CERT Безопасное кодирование о том, как правильно заполнять .

2 голосов
/ 13 августа 2012

Хотя это не ответ на ваш точный вопрос, это очень важно для вашей программы -

Я прочитал в Stanford CS106 Course Reader, доступном в PDF , что int num = rand() % 6 + 1; - неправильный способ получить случайное число от 1 до 6.

Я цитирую читателя курса:

Проблема здесь в том, что rand() гарантирует только то, что полученное значение равномерно распределено в диапазоне от 0 до RAND_MAX. Однако нет никакой гарантии, что остатки от деления на шесть будут случайными.

Они также объясняют, как сделать это правильно, что включает четыре различных шага (нормализация - масштабирование - перевод - преобразование).

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

Удачного кодирования!

1 голос
/ 28 июля 2011

Вы также можете использовать:

srand(time(NULL));

, который устранит возможные (крайне маловероятные) дубликаты.

0 голосов
/ 28 июля 2011

Вы можете явным образом привести его:

srand((unsigned int)clock());
...