0

Собственно вызываю $CardCookie = mt_rand(6103006430040008016, 6103006430040020000); , на выходе при генерации некоторых карт вылезает за указанный диапазон, замечено что на 24 значения где-то.

Как лечить?

  • У меня большие подозрения, что даже для 64битной системы у вас превышение максимального значения для integer тут присутствует. – Visman Dec 29 '17 at 14:14
  • Как быть? Мне надо карты сгенерить в этих диапазонах – CryptoWorks Dec 29 '17 at 14:15
  • Диапазон min - max не должен выходить за границы mt_getrandmax(). То есть (max - min) <= mt_getrandmax(). В противном случае, mt_rand() может возвращать менее качественные случайные числа. – Алексей Шиманский Dec 29 '17 at 14:16
  • 4
    Префикс выделите из числа 1030064300 и генерируйте только оставшуюся часть от 40008016 до 40020000. В ответ возвращайте строку, а не число, полученную конкатенацией строки 1030064300 и результата генерации. – Visman Dec 29 '17 at 14:17
  • @АлексейШиманский, ну, разность max и min там как раз небольшая – Кирилл Малышев Dec 29 '17 at 14:17

2 Answers2

0

mt_getrandmax(); - покажет, не превышен ли порог максимально возможного рандомного числа возвращаемого mt_rand. Если да, mt_rand может давать погрешность.

mt_rand(min, max);  (max - min) <= mt_getrandmax()
Kirill
  • 9,126
  • Реализовал через такое решение: $randCanc = 61030064300; $randGen = mt_rand(40008016,40020000); $CardCookie = $randCanc . $randGen; – CryptoWorks Dec 29 '17 at 14:59
0

Число слишком большое и не представимо точно в типе double.

Можно заметить, что на Си++ выводится другое значение: https://ideone.com/2pJ4uh

printf("%.0f", 6103006430040020000.);
6103006430040019968

Связанный вопрос: Отображение числа 9223372036854775807

Qwertiy
  • 123,725