Как упростить этот код (генерирует случайное целое число между минимальным и максимальным значением на основе беззнакового целого числа)?

StackOverflow https://stackoverflow.com/questions/140786

  •  02-07-2019
  •  | 
  •  

Вопрос

Код

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)

Проверьте конечные случаи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top