Генераторы случайных чисел не сохраняющие состояние существуют?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
16
задан 6 revs, 2 users 72% 23 May 2017 в 10:32
поделиться

10 ответов

Генератор случайных чисел имеет состояние - это - на самом деле необходимая функция. Следующее "случайное" число является функцией предыдущего числа и семени/состояния. Пуристы называют их генераторами псевдослучайного числа. Числа пройдут статистические тесты для случайности, но не - на самом деле - случайны.

последовательность случайных значений конечна и действительно повторяется.

Думают о генераторе случайных чисел как о перестановке набора чисел и затем раздавания их в произвольном порядке. Семя используется для "переставления" чисел. Как только семя установлено, последовательность чисел фиксируется и очень трудно предсказать. Некоторые семена повторятся раньше, чем другие.

Большинство генераторов имеет период, который достаточно долог, что никто не заметит его повторение. 48-разрядный генератор случайных чисел произведет несколько сотен миллиардов случайных чисел, прежде чем это повторится - с (AFAIK) любое 32-разрядное значение семени.

генератор А будет [только 1 110] генерировать как будто случайные значения, когда Вы дадите ему единственное семя и позволите ему извергнуть значения. Если Вы изменяете семена, то числа, сгенерированные с новым значением семени, не могут казаться случайными при сравнении со значениями, сгенерированными предыдущим семенем - все ставки выключены при изменении семян. Не делайте.

подход звука А должен иметь один генератор и "соглашение" числа вокруг Вашим различным клиентам. Не смешивайте с созданием и отбрасыванием генераторов. Не смешивайте с изменением семян.

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

Некоторые дистрибутивы Linux имеют /dev/random и /dev/urandom устройство. Можно считать их однажды для отбора генератора случайных чисел приложения. Они имеют более или менее случайные значения, но они работают путем "сбора шума" от случайных системных событий. Используйте их экономно, таким образом, существует много случайных событий между использованием.

21
ответ дан 30 November 2019 в 15:44
поделиться

Я рекомендовал бы использовать единственный генератор многократно. Насколько я знаю, все генераторы имеют состояние. При отборе генератора Вы устанавливаете его состояние на что-то на основе семени. Если Вы продолжаете порождать новые, вероятно, что семена, которые Вы срываете, не будут так случайны, как числа генерировали при помощи всего одного генератора.

Это особенно верно с большинством генераторов, которые я использовал, которые используют текущее время в миллисекундах как семя.

11
ответ дан 30 November 2019 в 15:44
поделиться

Основанный на аппаратных средствах, верный [1], генераторы случайных чисел возможны, но нетривиальны и часто имеют низко средние уровни. Availablity может также быть выпуском [2]. Гугление для "дробового шума" или "радиоактивного распада" в сочетании с "генератором случайных чисел" должно возвратить некоторые хиты.

Эти системы не должны поддерживать состояние. Вероятно, не, что Вы искали.

, Как отмечено другими, программные системы являются только псевдослучайными, и должен поддерживать состояние.

компромисс А должен использовать аппаратные средства базирующийся RNG для обеспечения энтропийного пула (сохраненное состояние), который сделан доступным для отбора PRNG. Это сделано вполне явно в реализации Linux/dev/random [3] и/dev/urandom [4].

Это некоторый аргумент о, насколько случайный исходные данные по умолчанию к/dev/random энтропийному пулу действительно.

<час>

Сноски:

  1. по модулю любые проблемы с нашим пониманием физики
  2. , потому что Вы ожидаете вероятностного процесса
  3. /dev/random прямой доступ функций к энтропийному пулу, отобранному из различных источников, которые, как полагают, были действительно или почти случайны, и блоки, когда энтропия исчерпывается
  4. ,/dev/urandom похож на/dev/random, но когда entopy исчерпывается, криптографический хеш используется, который делает энтропийный пул эффективно PRNG
с сохранением информации
9
ответ дан 30 November 2019 в 15:44
поделиться

Если Вы создаете RNG и генерируете единственное случайное число от него, тогда отбрасывают RNG, сгенерированное число только так случайно, как семя раньше запускало RNG.

было бы намного лучше создать единственный RNG и потянуть много чисел из него.

5
ответ дан 30 November 2019 в 15:44
поделиться

Как люди уже сказали, намного лучше отобрать PRNG однажды и снова использовать его. Безопасный PRNG является просто тем, который подходит для криптографических приложений. Единственный способ пересеять каждый раз даст довольно случайные результаты, то, куда он прибывает из по-настоящему случайного источника "реального мира" - т.е. специализированные аппаратные средства. Даже тогда возможно, что источник смещается, и все еще будет теоретически лучше использовать тот же PRNG.

2
ответ дан 30 November 2019 в 15:44
поделиться

Обычно отбор, который новое состояние берет вполне, в то время как для серьезного PRNG и создания новых каждый раз действительно не поможет многому. Единственный случай, о котором я могу думать, где Вы могли бы хотеть больше чем один PRNG, для различных систем, скажите в игре в казино, у Вас есть один генератор для перестановки карт и отдельной для генерации комментариев, сделанных символами автоматизированного контроля, этот путь ДЕЙСТВИТЕЛЬНО выделил пользователей, не может предположить результаты на основе символьных поведений.

А хорошее решение для отбора состоит в том, чтобы использовать этот (Random.org) , они предоставляют случайные числа, сгенерированные от атмосферных помех бесплатно. Это мог быть лучший источник для отбора, чем использование времени.

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

2
ответ дан 30 November 2019 в 15:44
поделиться

Стоит упомянуть, что Haskell является языком, который пытается полностью устранить изменяемое состояние. Для согласования этой цели с твердыми требованиями как IO (который требует некоторой формы переменчивости), монады должны привыкнуть к состоянию потока от одного вычисления до следующего. Таким образом Haskell реализует его генератор псевдослучайного числа. Строго говоря генерация случайных чисел является по сути операцией с сохранением информации, но Haskell в состоянии скрыть этот факт путем перемещения "мутации" состояния в связывание (>>=) операция.

Это, вероятно, звучит как немного краткого обзора, и он действительно не отвечает на Ваш вопрос полностью, но я думаю, что это все еще применимо. С теоретической точки зрения невозможно работать с RNG, не включая состояние. Независимо, существуют методы, которые могут использоваться, чтобы смягчить это взаимодействие и сделать его , появляются , как будто вся операция имеет природу не сохраняющую состояние.

1
ответ дан 30 November 2019 в 15:44
поделиться

Обычно лучше создать единственный PRNG и вытянуть несколько значений от него. Создание нескольких экземпляров означает, что необходимо удостовериться, что семена для экземпляров гарантируются уникальные, который запросит соединяющуюся определенную для экземпляра информацию.

Как в стороне, существуют лучшие "истинные" Генераторы случайных чисел, но они обычно требуют специализированных аппаратных средств, которые делают вещи, любят, получают случайные данные из различия электрического сигнала в компьютере. Если Вы действительно не волнуетесь по поводу этого, я сказал бы, что Генераторы псевдослучайных чисел, встроенные в библиотеки языка и/или ОС, вероятно, достаточны, пока Ваше значение семени не легко предсказуемо.

0
ответ дан 30 November 2019 в 15:44
поделиться

Использование безопасного PRNG зависит от Вашего приложения. Для чего используются случайные числа? Если бы они - что-то вроде действительного значения (например, что-либо криптографически связанное), Вы не хотели бы использовать что-либо меньше.

Безопасные PRNGs намного медленнее, и могут потребовать, чтобы библиотеки сделали операцию произвольной точности и тестирование простоты чисел, и т.д. и т.д.

0
ответ дан 30 November 2019 в 15:44
поделиться

Ну, пока они отобраны по-другому каждый раз, когда они создаются, тогда не, я не думаю, что было бы любое различие; однако, если бы это зависело от чего-то как время, тогда они, вероятно, были бы неоднородны, из-за смещенного семени.

-2
ответ дан 30 November 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: