Генератор псевдослучайных чисел

Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.

В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.

Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:

if (string1.equals(string2))

Этот метод String равен методу для двух строк Java, и если они содержат точно такую ​​же строку символов, они считаются равными.

Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Вариант 2: Сравнение строк с методом equalsIgnoreCase

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

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Вариант 3: сравнение строк Java с методом compareTo

Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).

Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()

13
задан Yamaneko 21 November 2012 в 16:37
поделиться

10 ответов

Лучший способ создать каждый к не к.

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

26
ответ дан coobird 22 November 2012 в 03:37
поделиться

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

вихрь Мерсенна алгоритм является популярным, довольно быстрым генератором псевдослучайного числа, который приводит к довольно хорошим результатам. Это имеет огромно большой период, но также и относительно огромное состояние (2,5 КБ). Однако это не считают достаточно хорошим для криптографических приложений.

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

, Если Вы делаете crypto, хотя, мой ответ остается: не прокручивайте свое собственное.

11
ответ дан Thomas 22 November 2012 в 03:37
поделиться
  • 1
    Я, кажется, помню довольно много связанных с cookie проблем с основанными на стойке платформами. Ваше решение должно работать, и надо надеяться любые проблемы разрешили с прошлого года. – Dex 21 October 2012 в 09:42

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

xkcd random number

5
ответ дан 2 revs 22 November 2012 в 03:37
поделиться

Немецкий журнал C't протестировал много генераторов программного и аппаратного обеспечения в проблеме 2/2009 и выполнил результаты через различные статистические тесты.

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

я не потрудился бы писать свое собственное. Статья упоминает, что даже Donald Knuth перестал работать со своим "Супергенератором случайных чисел", который не был так случаен, в конце концов. Получите тот, который прошел все тесты (имел результат> 0 во всех столбцах). Они также протестировали установку с ЧЕРЕЗ EPIA M10000 mobo, который имеет аппаратные средства RNG. Мне нравится эта опция за коммерческую или полукоммерческую установку, которая требует устойчивого сервера случайного числа с высокой пропускной способностью.

, Если, конечно, Вы просто не играете вокруг, в этом случае , это может быть достаточно хорошо.

7
ответ дан Community 22 November 2012 в 03:37
поделиться
1
ответ дан John D. Cook 22 November 2012 в 03:37
поделиться

Украдите тот из получислового knuth. Это высококачественно и просто реализовать. Это использует пару массивов, дополнения и нескольких IFS. Дешевый, эффективный, и хороший длительный период 2^55, если я вспоминаю правильно.

0
ответ дан EvilTeach 22 November 2012 в 03:37
поделиться
  • 1
    Просто для уточнения в этом конкретный случай (когда ошибка появляется на SYNTHESIZE_SINGLETON_FOR_CLASS) место для создания модификации к release в определении SYNTHESIZE_SINGLETON_FOR_CLASS макрос, который должен быть объявлен в SynthesizeSingleton.h. – aroth 24 January 2013 в 00:26
-3
ответ дан Jayan 22 November 2012 в 03:37
поделиться
  • 1
    Он говорит о подпапках, например, layout-hdpi/buttons/mybutton.xml, не папки ресурса сам. – KingCrunch 31 December 2010 в 16:56

Yikes, который может получить сложный VEEEEEERY! Кажется, существует много метрик для того, как измерить "случайность" генератора случайных чисел, таким образом, это трудно к meaure, которые являются "лучшими". Я запустил бы с Числовые Рецепты в C (или безотносительно языка, который можно найти один для) для нескольких примеров. Я кодировал свой первый простой от примеров, данных там.

РЕДАКТИРОВАНИЕ: также важно запуститься путем определения, как сложный Вам нужен Ваш генератор случайных чисел, чтобы быть. Я помню грубое пробуждение, в котором я имел годы несколько C назад, когда я обнаружил, что генератор случайных чисел по умолчанию имел период где-нибудь приблизительно 32 767, означая, что он имел тенденцию повторяться периодически после генерации что много чисел! Если Вам нужны несколько бросков костей, это прекрасно. Но не, когда необходимо генерировать миллионы "случайных" значений для моделирования.

3
ответ дан gnovice 22 November 2012 в 03:37
поделиться

См. По этой ссылке набор тестов TestU01, который включает несколько наборов тестов.

http://www.iro.umontreal.ca/~simardr/testu01/tu01.html

В статье автор демонстрирует результат теста на множестве существующих ГСЧ, но не на .NET System.Random (насколько я могу судить). Хотя он проверяет генератор VB6.

Очень немногие проходят все тесты ...

1
ответ дан 1 December 2019 в 17:34
поделиться

Если вы собираетесь работать на C ++, Boost имеет набор PRNG, которым я бы доверял гораздо больше, чем тому, что есть в стандартных библиотеках. Документация может оказаться полезной при выборе одного из них. Как всегда, насколько хорош ГПСЧ, зависит от того, для чего вы его используете.

0
ответ дан 1 December 2019 в 17:34
поделиться
Другие вопросы по тегам:

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