Как производить случайные числа внутри ранга стоимости?

Я хотел бы знать, как производить число случайным образом (Random) давая интервал стоимости.

Например, с интервалом 1 в 10, я хочу получить 4,6,3,9,10,3,1,5,2,... но когда бы то ни было 0,-1,11,12..

14
задан 08.03.2016, 11:52
6 ответов
numero = (int) (Math.random() * n) + 1;

, Где n состоит даже nГєmero в том, что ты хочешь, чтобы он прибыл, + 1 для того, чтобы никогда ты не имел одного 0 и cast по отношению к int, потому что Math#random бросает стоимость типа double.

20
ответ дан 24.11.2019, 14:45

Ты можешь использовать класс ThreadLocalRandom что делает exáctamente то, в чем ты нуждаешься.

import java.util.concurrent.ThreadLocalRandom;

int numero = ThreadLocalRandom.current().nextInt(min, max + 1);
7
ответ дан 24.11.2019, 14:45
  • 1
    Быть и # 237; чтобы лучше использовать java.util.Random, который является отцом этого класса и работает хорошо в локальных атмосферах одним м и # 233; все. –  08.03.2016, 16:41
  • 2
    я думаю, что это не очень нужно, волновать OP со скоплением и трэдами, когда мы говорим о чем-то таком основном – Jordi Castilla 08.03.2016, 16:42
  • 3
    @JordiCastilla в действительности никогда он не известен, возможно, что инстанция, если он использовался в м и # 250; ltiples трэды. –  08.03.2016, 16:43
  • 4
    raz и # 243; n, из-за которой prefer и # 237; этот м и # 233; все вместо класса Random, потому что expl и # 237; citamente он позволяет тебе показывать м и # 237; nimo и м и # 225; ximo, он не нуждается ни в каком manipulaci и # 243; n дополнительный (adem и # 225; s + 1 в max) или помнить одну f и # 243; rmula. @LuiggiMendoza какая-то невыгода существует использования ее? – Diego Torres 08.03.2016, 17:12
  • 5
    Я не работал с ThreadLocalRandom, но seg и # 250; n я вижу в Ваших шрифтах различие между Вашими nextInt и тот Random состоит в том, что в Random он имеет зерно инстанцией в то время как ThreadLocalRandom имеет зерно трэдом, где он работает. Правда не har и # 237; в большое различие. –  08.03.2016, 17:16

Хороший способ производить интервалы был бы следующей:

Random aleatorio = new Random();
System.out.println(8+aleatorio.nextInt( (10+1) - 8));

Таким образом числа произведутся 10 в ранге 8.

2
ответ дан 24.11.2019, 14:45

Здесь тебя оставил руководитель, очень полный и легкий для того, чтобы быть понятен на Math.random и random.nextInt:

http://javarevisited.blogspot.com.es/2013/05/how-to-generate-random-numbers-in-java-between-range.html

для твоего случая особенно, код был бы:

for(int i =0; i<3; i++){
    int randomInteger = random.nextInt(10) + 1;
    System.out.println("pseudo random int in a range : " + randomInteger);
}

Output:
pseudo random int in a range : 7
pseudo random int in a range : 1
pseudo random int in a range : 3
1
ответ дан 24.11.2019, 14:45
  • 1
    random#nextInt(10) произведи один n и # 250; морской окунь между 0 и 9, не между 1 и 10... –  08.03.2016, 16:41
  • 2
    Тогда твой не ответ, а копируемый / прикрепленный сайта X. –  08.03.2016, 16:44
  • 3
    Я себя забываю измениться это, ЧЕЛОВЕЧЕСКАЯ неудача, остаться из-за неудачи забытия что-то - ПАТЕТИЧЕСКИЙ... – M. Mariscal 08.03.2016, 16:46
  • 4
    Это не ЧЕЛОВЕЧЕСКАЯ неудача, а отсутствие чувства из-за того, что поддерживает других ЛЮДЕЙ ответом. Любой ЧЕЛОВЕК может копировать / прикреплять случайный текст, ассоциируемый с вопросом. Даже ЧЕЛОВЕК может создавать aplicaci и # 243; n для того, чтобы КОМПЬЮТЕР смог делать это вместо и #233; l/ella. Не любой ЧЕЛОВЕК может предлагать ответ. –  08.03.2016, 16:49
  • 5
    Обновленный ответ... – M. Mariscal 08.03.2016, 16:58
public static void main(String[] args){
    //hay que importar la librerai Random
    //java.util.Random

    //generador de numeros aleatorios
    Random generadorAleatorios = new Random();

    //genera un numero entre 1 y 5 y lo guarda en la variable numeroAleatorio
    int numeroAleatorio = 1+generadorAleatorios.nextInt(5);
    //imprimo el numero en consola
    System.out.println(numeroAleatorio);

}
1
ответ дан 24.11.2019, 14:45

Это пример, где мы определяем стоимость между рангом стоимости min и max:

int numeroRandom = ThreadLocalRandom.current().nextInt(min, max);

мы можем реализовывать то же самое посредством метода:

private int getNumeroRandom(int min, int max){
       return ThreadLocalRandom.current().nextInt(min, max);
   }

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

int min = 1, max = 10;
System.out.println(getNumeroRandom(min, max));

Восток - пример 100 повторений, полученных с предложенным методом, определяя как интервал 1 в 10:

8, 9, 2, 1, 2, 4, 9, 4, 1, 4, 7, 2, 8, 9, 1, 3, 4, 2, 5, 6, 5, 5, 6, 6, 1, 3, 3, 1, 5, 2, 4, 4, 3, 1, 1, 2, 8, 6, 4, 6, 4, 6, 8, 5, 7, 5, 8, 5, 1, 6, 7, 2, 2, 6, 7, 1, 7, 4, 8, 1, 3, 5, 1, 2, 4, 6, 4, 8, 5, 4, 9, 4, 7, 5, 4, 8, 3, 7, 8, 4, 4, 1, 7, 4, 8, 3, 3, 2, 3, 3, 2, 8, 9, 4, 9, 9, 9, 4, 5, 9, 6
1
ответ дан 24.11.2019, 14:45

В Java существуют два главных класса, чтобы производить случайные числа:

  • java.util.Random
  • java.security.SecureRandom

Функция Math.random() используй java.util.Random на всякий случай.

Тем временем, он не является очень важным, если произведенные данные действительно случайные, Math.random() или Random сделайте работу, но есть проблема:

Если я произвожу случайные данные с той же последовательностью кода и с тем же зерном, всегда будут производиться те же данные, которые кажутся случайными, но в действительности будут подходящими для воспроизведения. По тому же разуму, типично используется печать времени (как System.currentTimeMillis()) чтобы производить новые данные.

На практике используется код:

Random aleatorio = new Random(System.currentTimeMillis());
// Producir nuevo int aleatorio entre 0 y 99
int intAletorio = aleatorio.nextInt(100);
// Más código

// Refrescar datos aleatorios 
aleatorio.setSeed(System.currentTimeMillis());
// ... o mejor
aleatorio.setSeed(aleatorio.getLong());

Что я делаю в случае, что я хочу убедиться, что я произвожу действительно случайные данные?

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

Шифрование снабжает для этих использований PRNG (pseudorandom number generator), генераторы псевдослучайных чисел. Почему pseudo? Ну, в действительности договорная вычислительная система неспособна легко делать что-то случайным, это слишком много determinístico для этого. Но существуют алгоритмы, которые поставляют приближение достаточно случайный, чтобы выполнять все задания, в которых он они нуждается.

Класс SecureRandom работай с алгоритмами SHA1PRNG Sun, которые выполняют с требованиями RFC 1750 (на английском) на поколении случайных данных криптообразно громко (не determinístico).

В поколении идентификаторов сеансов, например, он высоко рекомендуемый предпочитания SecureRandom на Random.

Как он используется?

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

// Generar un nuevo generador con el algoritmo por defecto
SecureRandom sr = new SecureRandom();

или

SecureRandom sr = null;
try {
    sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
    // para garantizar el caracter aleatorio generemos una nueva semilla
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (NoSuchProviderException e) {
    e.printStackTrace();
} 

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

// La lista byte[] es suficiente, la llamada se hace únicamente para causar la generación de una nueva semilla 
sr.nextBytes(new byte[1]);

Генератор готов, чтобы использовать, и я могу производить случайные числа в разнообразии форм. Какие-то есть оба класса общим:

// Un valor long
sr.nextLong();
// Un valor int
sr.nextInt();
// Un valor float
sr.nextFloat();
// Un valor double
sr.nextDouble();
// Un valor gaussian (entre -1 y 1))
sr.nextGaussian();
// Un valor boolean, como lanzar una moneda
sr.nextBoolean();
// ... y un valor int entre 0 (inclusivo) y int n (exclusivo)
sr.nextInt(n);
// Así para tener un valor entero aleatorio de 1 al 10, se usa
sr.nextInt(10)+1;

Кроме того, SecureRandom предложи больше методов:

// Un valor int de int x bits, ajustado a la derecha
sr.next(x);
// Para obtener una cantidad de bytes aleatorios, se `puede usar lo siguiente
byte[] b = new byte[128]
sr.getBytes(b);

Чтобы улучшать случайный символ нужно сеять генератор каждый раз между тем:

byte[] b = new byte[20];
sr.setSeed(b)
// Alternativamente se puede usar un long para resembrar
sr.setSeed(System.currentTimeMillis());

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

13
ответ дан 03.12.2019, 22:55