Генератор случайных чисел - PullRequest
3 голосов
/ 16 марта 2009

Мне нужно написать программу на Java для генерации случайных чисел в диапазоне [0,1] по формуле:

X i = (aX i-1 + b) мод m

при условии, что любые фиксированные значения int для a, b & m и X 0 = 0,5 (т.е. i = 0)

Как мне это сделать?

Я пытался сделать это, но это явно неправильно:

int a = 25173, b = 13849, m = 32768;
double X_[i];
for (int i = 1; i<100; i++)
   X_[i] = (a*(X_[i]-1) + b) % m;
double X_[0] = 0.5;
double double = new double();
System.out.println [new double];

Ответы [ 6 ]

8 голосов
/ 16 марта 2009

Вот несколько подсказок:

int a, d, m, x;

Умножение * и мод %.

обновление

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

Важная строка кода будет

x = (a * x + b) % m ;

Вам не нужен еще один x, потому что x на правой стороне = - это СТАРЫЙ x или x i-1 ; тот, что слева, будет вашим "новым" x или x i .

Теперь вам нужно написать Java-оболочку, которая позволит вам создать метод , что означает написание класса .

.
4 голосов
/ 16 марта 2009

Похоже на домашнюю работу ... поэтому я не дам вам решения в коде.

В любом случае вам необходим линейный конгруэнтный генератор .

СОВЕТ: Вам нужно написать эту математическую формулу как функцию.

Шаги:

  1. Сделай урок.
  2. Добавить требуемое состояние в качестве члена класса.
  3. Создать функцию в классе. Сделайте так, чтобы входные данные при необходимости.
  4. Напишите формулу для конгруэнтного генератора в Java (посмотрите математические операции в Java).
  5. Вернуть результат.

Моя Java ржавая, поэтому я не могу сказать, что уверен в этом, но это, вероятно, ошибки:

int a = 25173, b = 13849, m = 32768;
double X_[i];//You need to define a constant array or use perhaps a list, you can't use i without defining it
for (int i = 1; i<100; i++)
   X_[i] = (a*(X_[i]-1) + b) % m;
double X_[0] = 0.5;
double double = new double(); //You can't name a variable double, also types like double, don't need to be newed (I think)
System.out.println [new double]; //println uses () not [], in Java I think all functions need to use (), its not implied
1 голос
/ 17 марта 2009

Линейный конгруэнтный генератор - это, по сути, выражение, которое модифицирует заданное значение для получения следующего значения в ряду. Он принимает форму:

x i + 1 = (a . x i + b) мод m

как вы уже указали (немного иначе: меня учили всегда ставить x i + 1 слева, и я все еще боюсь моих учителей математики 25 лет спустя :-), где значения для a, b и m тщательно отобраны, чтобы дать приличный диапазон значений. Обратите внимание, что с оператором mod вы всегда получите значение от 0 до m-1 включительно.

Также обратите внимание, что значения имеют тенденцию быть целыми, а не числами с плавающей запятой, поэтому, если, по вашему запросу, вам нужно значение в диапазоне 0-0,999 ... вам нужно поделить интегральное значение на m чтобы получить это.

Объяснив, как это работает, вот простая Java-программа, которая реализует ее, используя значения a, b и m из вашего вопроса:

public class myRnd {
    // Linear congruential values for x(i+1) = (a * x(i) + b) % m.
    final static int a = 25173;
    final static int b = 13849;
    final static int m = 32768;

    // Current value for returning.
    int x;

    public myRnd() {
        // Constructor simply sets value to half of m, equivalent to 0.5.
        x = m / 2;
    }

    double next() {
        // Calculate next value in sequence.
        x = (a * x + b) % m;

        // Return its 0-to-1 value.
        return (double)x / m;
    }

    public static void main(String[] args) {
        // Create a new myRnd instance.
        myRnd r = new myRnd();

        // Output 20 random numbers from it.
        for (int i = 0; i < 20; i++) {
            System.out.println (r.next());
        }
    }   
}

А вот вывод, который мне все равно кажется случайным: -).

0.922637939453125
0.98748779296875
0.452850341796875
0.0242919921875
0.924957275390625
0.37213134765625
0.085052490234375
0.448974609375
0.460479736328125
0.07904052734375
0.109832763671875
0.2427978515625
0.372955322265625
0.82696533203125
0.620941162109375
0.37451171875
0.006134033203125
0.83465576171875
0.212127685546875
0.3128662109375
1 голос
/ 16 марта 2009

EDIT: Bongers:

  1. [] - это специальные символы, если вы хотели, чтобы ваша переменная называлась «X_ [i]», и она не будет работать. Если вы намеревались создать массив, вы делаете его слишком сложным.

  2. Вы должны выяснить, было ли исходное уравнение Y Xi-1 или X (i-1), поскольку это имеет огромное значение в вашем программировании. Си - 1 всего на один меньше, чем Си. X (i-1) - предыдущее случайное число.

  3. попробуйте сделать несколько уроков для начинающих по Java. Вот хорошее место для начала. На самом деле попытайтесь понять учебники, прежде чем перейти к вашей проблеме.

  4. Подумайте о своей проблеме следующим образом. [Предполагая, что уравнение равно X (i-1)] Чтобы сгенерировать третье случайное число, X3, вам нужно сгенерировать X2, для которого требуется X1, для которого требуется X0. Но у вас есть Х0. Поэтому для любого Xi начните с X0, сгенерируйте X1, затем сгенерируйте X2 и т. Д. До Xi.

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

0 голосов
/ 16 сентября 2012
public class generate_random_numbers {

    public static void main(String[] args) {
        int a = 25173, b = 13849, m = 32768;
        Double[] X_ = new Double[100];
        X_[0] = 0.5;
        for (int i = 1; i < 100; i++) {
            X_[i] = (a * X_[i - 1] + b) % m;
            X_[i] = X_[i] / m;
            System.out.println("X_[" + i + "] = " + X_[i]);
        }
    }
}
0 голосов
/ 16 марта 2009

Я бы начал с создания класса, который содержит a, b, m, самый последний x (инициализированный до 0.5) и такой метод, как getNextNumber ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...