Nano Hash - криптовалюты, майнинг, программирование

Последние 3 цифры всегда равны нулю при генерации 15-значного случайного числа.

Я хотел сгенерировать случайное число между 1_000_0000_0000_000 и 9_999_9999_9999_999L, используя Java, поэтому я использовал следующий код:

final long MAX_NUMBER = 9_999_9999_9999_999L;
final long MIN_NUMBER = 1_000_0000_0000_000L;
System.out.print(Long.valueOf(new Random().nextLong() * 
                     (MAX_NUMBER - MIN_NUMBER)));

Проблема с кодом в том, что код генерирует 15-значное случайное число, но последние 3 цифры всегда равны нулю, и иногда он генерирует отрицательное число.

Кто-нибудь может сказать мне, почему последние 3 цифры всегда равны нулю?

Вот некоторые из выходов,

7160629848698886104000

-6581075034034719564000

6645937379553681443000

6363833355925386903000

25.01.2015

  • Код работает нормально для меня. Я не получаю 3 нуля в конце. Какой рандом вы импортируете? 25.01.2015
  • Я импортирую import java.util.Random 25.01.2015
  • Согласен с @Хайден. Выходы: 3975621119110322698 9168405849564378394 -7822944210852808832 25.01.2015
  • Вы используете 32-битную или 64-битную операционную систему? Я не знаю, актуально ли это, но хорошо, чтобы охватить все случаи. 25.01.2015
  • Я использую 64-битную Windows 7 и процессор AMD. 25.01.2015
  • Какую JVM вы используете? 25.01.2015
  • тот, который установлен по умолчанию. Я использую JRE1.7 25.01.2015
  • Группировка из 1, 3, 4, 4, 3 цифр любопытна, но формально не ошибочна. Разве тот факт, что вы получаете 22-разрядные выходные данные вместо 15-разрядных выходных данных, не означает, что существуют проблемы, совершенно не связанные с проблемами конечных нулей? 25.01.2015
  • Вы печатаете что-нибудь еще в своей программе? Я заметил, что вы используете print, а не println. Возможно, вы позже println 000 добавите к своему предыдущему print 26.01.2015

Ответы:


1

nextLong() может возвращать любое длинное значение, включая отрицательные значения. Умножение результата nextLong() на (MAX_NUMBER - MIN_NUMBER) может привести к переполнению и не даст результата в требуемом диапазоне.

Вместо этого вы можете использовать Math.random() :

System.out.print((long)(Math.random() * (MAX_NUMBER - MIN_NUMBER))+ MIN_NUMBER);
25.01.2015
  • спасибо, но последние 3 цифры сгенерированного числа по-прежнему нули. Некоторые результаты с использованием вашего подхода, 687008666691635000, 322464880868778000, 8823481009216000, 3935643560572000 25.01.2015
  • @micheller Во-первых, я забыл добавить MIN_NUMBER к результату, что гарантирует, что результат не будет слишком маленьким. Тем не менее, я не вывожу вывод, оканчивающийся на ноль. 25.01.2015

  • 2

    Странно, я не могу воспроизвести вашу проблему. Похоже, генерация случайных чисел JVM ошибочна? Вы можете попробовать SecureRandom вместо Random.

    Кстати, я просто хотел отметить, что паттерн Math.random() * (max - min) + min не приводит к равномерному распределению (хотя и близко).

    Вы можете попробовать Apache Commons: Генератор случайных данных. Он имеет реализацию nextLong(long lower, long upper).

    https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/random/RandomDataGenerator.html

    25.01.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..