Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > псевдослучайное число из промежутка [-n;n)


Автор: turtles 22.8.2011, 10:40
Здравствуйте! У меня вот такой вопрос по коду, подскажите по заданию я правильно написал код или что не правильно?
Вот задание:
Создайте программу, которая будет генерировать и выводить на экран
вещественное псевдослучайное число из промежутка [-3;3).
Код

public class MathRandom {
    public static void main(String args[]){
      final int min = -3;
      final int max = 3;
        double  ran = Math.random()* min * max;
        System.out.println("Число из промежутка -> [-3;3) = " + ran);
    }
}

Автор: LSD 22.8.2011, 10:56
Код

    private Random random = new Random();

    private int getRandom(int n) {
        n = Math.abs(n);
        return random.nextInt(n * 2) - n;
    }

Автор: turtles 22.8.2011, 12:09
подскажите пожалуйста как правильно вычисляется промежуток или по какой формуле
если например вот такой диапазон чисел (-3;3),(-3;3],[-3;3] и [-3;3) или такой (-3;-3),(-3;-3],[-3;-3] и [-3;-3) 

Автор: dorogoyIV 22.8.2011, 14:48
как то так наверное...  smile 
Код

import java.util.*;

public class Test
{
 public static void main(String [] args)
 {
  int min = -3;
  int max = 3;
  int x = getRandomNumberInInterval(min, max);
  System.out.println(x);
 }

 private static int getRandomNumberInInterval(int min, int max)
 {
  int [] x = new int [max - min + 1];

  for(int i = min, j = 0; i <= max; i++, j++)
   x [j] = i;

  return x [new Random().nextInt(x.length)];
 }
}

Автор: LSD 22.8.2011, 14:48
Код

random.nextInt(n)

Генерирует числа в диапазоне [0, n). Дальше простым вычитанием получаем нужный диапазон.

Автор: jk1 23.8.2011, 04:19
LSD, 
Цитата

Создайте программу, которая будет генерировать и выводить на экран
вещественное псевдослучайное число из промежутка

Автор: pathfinder 23.8.2011, 09:46
jk1, целые числа являются подмножеством вещественных, следовательно алгоритм LSD корректен.

А если серьезно.

Код

private Random random = new Random();

public double getRandomIn(int min, int max) {
        // todo check input ...
    double size = (max - min);
    return min + ((random.nextDouble() * size) - (size/2));
}

Автор: LSD 23.8.2011, 10:03
Цитата(jk1 @  23.8.2011,  05:19 Найти цитируемый пост)
Создайте программу, которая будет генерировать и выводить на экран
вещественное псевдослучайное число из промежутка

Упс smile

Тогда так:
Код

    private static Random rnd = new Random();

    public static double getRandom(int min, int max) {
        if(min >= max) {
            throw new IllegalArgumentException();
        }
        int delta = max - min;
        return rnd.nextDouble() * delta + min;
    }


Добавлено через 2 минуты и 11 секунд
pathfinder у тебя ошибка в коде, getRandomIn(0, 10) может вернуть отрицательное значение.

Автор: jk1 23.8.2011, 10:12
Цитата

jk1, целые числа являются подмножеством вещественных, следовательно алгоритм LSD корректен.


 smile 

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

Автор: LSD 23.8.2011, 10:17
Самое интересное это получение незамкнутых диапазонов. Типа (min, max):
Код

    private static Random rnd = new Random();

    public static double getRandom(int min, int max) {
        int delta = max - min;
        double v = rnd.nextDouble() * delta + min;
        if (v == min) {
            v = Math.nextAfter(v, max);
        } else if (v == max) {
            v = Math.nextAfter(v, min);
        }
        return v;
    }

Автор: danco0x53 23.8.2011, 14:47
   LSD, вторая проверка излишня. JavaDoc говорит:
Цитата

The general contract of nextDouble is that one double value, chosen (approximately) uniformly from the range 0.0d (inclusive) to 1.0d (exclusive), is pseudorandomly generated and returned.

   Так что ==max не будет, если только max не будет меньше min.

Автор: antondrafff 2.9.2011, 17:15
Используйте нормальное распределение, моделируется так:
Код

Random rnd = new Random();
double result = 0;
for (int i=0; i < 12; ++i) {
double drnd = rnd.nextDouble();
result += drnd;
}
double randomValue = result / 6;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)