2013-11-17 3 views
0

Мне было интересно, могу ли я установить точность случайных двойных чисел, которые я генерирую.Установить точность случайных чисел в java?

Random generator = new Random(); 
double randomIndex = generator.nextDouble()*10000; 

Это производит случайные числа в пределах 10000. Как я смог установить точность до 4?

+1

Что вы подразумеваете под «точностью» случайного числа? Что вы хотите в качестве вывода? –

+0

4 цифры после десятичной метки. – jsh6303

+1

Тогда это проблема форматирования. –

ответ

2

пару вещей. Во-первых, вы имеете в виду «точность», а не «точность». Во-вторых, вам нужно уточнить , почему вы хотите сделать это, потому что от него будет зависеть правильный ответ.

Если все, что вы хотите сделать, это отображение чисел с этой точностью, это проблема форматирования. Вы можете использовать, например. System.out.printf("%.4f", value) или String.format().

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

double value = (int)(generateor.nextDouble() * 10000.0)/10000.0; 

Или, если вы хотите, чтобы ваш диапазон быть 0- 10000 вместо 0-1:

double value = (int)(generateor.nextDouble() * 100000000.0)/10000.0; 

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

int value = (int)(generator.nextDouble() * 10000.0); 

Тогда вы можете работать на том, что внутри, и дисплей как:

System.out.printf("%.4f", value/10000.0); 

Adjust коэффициент умножения выше, если вы имеете в виду вы хотите ваш диапазон будет 0-10000.

Если вы просто пытаетесь сгенерировать число в [0, 10000), вы можете использовать Random.nextInt(int) с указанным диапазоном или просто передать значение int, как указано выше (необязательно округление).

2
  Random generator = new Random(); 
     double randomIndex = generator.nextDouble()*10000;    
     randomIndex=Math.floor(randomIndex * 10000)/10000;//this is the trick 
+0

Хорошая идея, к сожалению, не работает. – Ingo

+0

@Ingo It *. * Работа, это только, что ваш оригинальный вопрос был неясным. –

+1

Все решения, в том числе и мои собственные, имеют ошибку, состоящую в том, что двойник просто не имеет «десятичных позиций», поэтому вы можете в конечном итоге с цифрами, которые печатаются с более (или менее) десятичными знаками. – Ingo

1

Если вы хотите 4 цифры после десятичного знака, вы можете просто сделать следующее:

Random generator = new Random(); 
double randomIndex = Math.floor(generator.nextDouble()*10000 * 10000) /10000; 
+0

Нужно ли мне импортировать что-либо, добавляя «Math»? – jsh6303

+0

@JiajuShen Вы можете а) попробовать, или б) http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html. –

1
Random generator = new Random(); 
double randomIndex = Double.parseDouble(new DecimalFormat("##.####") 
       .format(generator.nextDouble() * 10000)); 
+0

Это довольно окольный способ делать '(int) (значение * 10000.0 + 0.5)/10000.0', я думаю. –

1

Просто

double result = generator.nextLong()/10000.0; 

Обратите внимание, hoewever, что вы никогда не можете быть уверены в том, что число имеет ровно 4 знаков после запятой, всякий раз, когда вы попали в число, которое не представима в два раза.

В любом случае, требование глупо, потому что double просто не имеет десятичных позиций. Следовательно, запросить 4 из них не имеет смысла.

+0

Стоит отметить, что теоретический диапазон этого составляет -922337203685477.5808 до 922337203685477.5807; действительный диапазон и распределение, подверженные ограничениям 'nextLong()' и внутреннему представлению 'double'. –

+0

Да, @JasonC можно также использовать nextInt(), конечно. – Ingo

Смежные вопросы