Как упростить этот код (генерирует случайное целое число между минимальным и максимальным значением на основе беззнакового целого числа)?
Вопрос
Код
return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
(number / (UINT_MAX + 1.0)));
число — это случайное число, полученное с помощью rand_s.min и max являются целыми числами и представляют минимальное и максимальное значения (включительно).
Если вы предлагаете решение, не использующее беззнаковое целое число в качестве числа, также объясните, как сделать его случайным.
Пожалуйста, не отправляйте решения с помощью rand().
Решение
А static_cast<double>
является излишним, поскольку «+1,0» в любом случае приведет к удвоению продвижения по службе.
Другие советы
В числовых рецептах на C:Искусство научных вычислений (Уильям Х.Пресс, Брайан П.Фланнери, Сол А.Теукольский, Уильям Т.Феттерлинг;Нью-Йорк:Издательство Кембриджского университета, 1992 (2-е изд., стр.277)) сделаны следующие комментарии:
«Если вы хотите генерировать случайное целое число между 1 и 10, вы всегда должны делать это, используя биты высокого порядка, как в
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
И никогда не напоминающим
j = 1 + (rand() % 10);
(который использует биты младшего порядка)».
От man 3 rand
Как насчет Усиление: Случайное
Вы можете выполнять арифметические действия в формате unsigned long вместо double, но только если ULONGLONG_MAX >= UINT_MAX*UINT_MAX, что, вероятно, определяется реализацией.Но если вас это беспокоит, вас может беспокоить потенциальная потеря точности исходного кода в случае, когда (max - min) или RAND_MAX велико.
Будет ли long long на самом деле быстрее, может зависеть от того, насколько хороша аппаратная поддержка вашей платформы.Но целочисленная арифметика, возможно, по своей сути проще, чем арифметика с плавающей запятой.
Что-то вроде
min + number % (max - min + 1)
Проверьте конечные случаи