Ладно

У меня проблема в том, что я хочу сгенерировать 64 числа от 0 до 1 (что означает 0 или 1)

Функция, которая у меня есть в настоящее время:

public static int randNr(int max) {
Random r = new Random();
int o = r.nextInt(max);
return o;
}

Но он всегда возвращает 0. Есть ли способ сделать так, чтобы он также генерировал 1?

РЕДАКТИРОВАТЬ:

Функция находится в другом java-файле, чем когда я ее вызываю!

-1
Ch3t0r 2 Июн 2014 в 11:06
Каково значение макс.?. Вы получаете случайные числа до "max"
 – 
TheLostMind
2 Июн 2014 в 11:06
5
Вы заметили, что максимальное значение является эксклюзивным? Чтобы сгенерировать 0 или 1, вам нужно передать 2.
 – 
Denys Séguret
2 Июн 2014 в 11:07
1
@ user2864740: вы правы, я запутался с .NET, где он будет генерировать те же значения (в Java это не так).
 – 
Jeroen Vannevel
2 Июн 2014 в 11:14

2 ответа

Лучший ответ

Две проблемы:

1) nextInt(max); генерирует число от 0 до, но не включая max. Я предполагаю, что вы передаете 1 как max. Пройдите 2 и все будет хорошо.

2) Создание нового объекта генератора каждый раз портит статистические свойства генератора. Вы должны создать один экземпляр Random и (i) либо передать в функцию, либо (ii) сохранить экземпляр как переменную-член.

2
Bathsheba 2 Июн 2014 в 11:10

Эта функция работает нормально. Вероятно, вы вызываете его с неправильными аргументами . Так должно быть:

randNr(2)

Почему? Потому что он использует метод Random#nextInt(max), который возвращает случайное целое число в диапазоне [0, max-1] (включая 0 и max-1).

Примечание. Не рекомендуется создавать новый объект Random при каждом вызове функции. Одним из решений было бы объявить объект Random как член класса static:

public class Test
{
    private static Random r = new Random();
    // ...
}

Другое решение - использовать метод static Math.random() 1 :

int o = (int) Math.round(Math.random());

1: Может ли кто-нибудь подтвердить, что этот метод быстрее, чем OP?

1
Christian Tapia 2 Июн 2014 в 11:25
Хороший ответ, когда вы обращаетесь к главному, но неправильное использование объекта Random связано не только с эффективностью, но, что более важно, с тем фактом, что распределение случайных чисел не будет иметь правильных статистических свойств.
 – 
Bathsheba
2 Июн 2014 в 11:13
Вы можете объяснить это немного лучше? Я проверил его, и он, кажется, дает правильные результаты.
 – 
Christian Tapia
2 Июн 2014 в 11:16
Нет, ваше решение верно. Мне просто не нравится упор на эффективность. Есть много научных работ, которые являются чушью из-за неправильного использования случайных чисел. Последовательность случайных чисел, рисующая 0 и 1, должна иметь среднее значение 1/2 и дисперсию 1/4. Я сомневаюсь, что последовательность, создаваемая при непрерывной установке начального числа генератора случайных чисел на системные часы, обладает даже такими свойствами.
 – 
Bathsheba
2 Июн 2014 в 11:22
Вы возможно правы. Но я все еще думаю, что неэффективно и нецелесообразно создавать 1-use-object на каждой итерации.
 – 
Christian Tapia
2 Июн 2014 в 11:27
Вы оба правы. Современные процессоры настолько быстры, что можно создавать множество экземпляров ГПСЧ с одинаковым начальным значением, что разрушает корреляцию и поведение распределения между экземплярами. С точки зрения эффективности, это все равно, что копать новый колодец каждый раз, когда вам нужен стакан воды, а не копать один колодец и возвращаться к нему за таким количеством стаканов воды, сколько вам нужно.
 – 
pjs
2 Июн 2014 в 20:59