Mai mult
Cum pot genera aleator numere întregi într-un interval specific în Java?
Cum pot genera aleatoriu un int
valoarea într-un anumit interval?
Am încercat următoarele, dar alea nu merg:
Încercare de 1:
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Încercare de 2:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
3359
65
În Java 1.7 sau mai târziu, modul standard de a face acest lucru este după cum urmează:
A se vedea relevante JavaDoc. Această abordare are avantajul de a nu avea nevoie pentru a inițializa în mod explicit o java.util.Aleatoare de exemplu, care poate fi o sursă de confuzie și eroare dacă este utilizat necorespunzător.
Cu toate acestea, în schimb nu există nici o modalitate de a seta în mod explicit de semințe astfel încât acesta poate fi dificil de a reproduce rezultatele în situații în care este util, cum ar fi testarea sau joc de economisire membre sau similare. În aceste situații, pre-Java 1.7 tehnica prezentată mai jos pot fi utilizate.
Înainte de Java 1.7, modul standard de a face acest lucru este după cum urmează:
A se vedea relevante JavaDoc. În practică, java.util.Aleatoare clasă este de multe ori preferat să java.lang.Matematica.random().
În special, nu este nevoie să reinventeze număr întreg aleator generație roata atunci când există un API simplu de utilizat în biblioteca standard pentru a realiza sarcina.
Rețineți că această abordare este mult mai părtinitoare și mai puțin eficientă decât o nextInt` abordare, https://stackoverflow.com/a/738651/360211
Un model standard pentru realizarea acestui lucru este:
De Java Matematica funcția de bibliotecă Matematică.random() genereaza o valoare dublă în intervalul
[0,1)
. Observați acest interval nu include 1.În scopul de a obține un anumit interval de valori, în primul rând, aveți nevoie pentru a se multiplica de amploarea gamei de valori vrei acoperit.
Acesta returnează o valoare în intervalul `[0,Max-Min), unde 'Max-Min' nu este inclus.
De exemplu, dacă vrei
[5,10)
, aveți nevoie pentru a acoperi cinci valori întregi astfel încât să utilizațiAcest lucru se va întoarce o valoare în intervalul
[0,5)
, unde 5 nu este inclus.Acum aveți nevoie pentru a schimba acest interval de până la intervalul pe care îl vizați. Puteți face acest lucru prin adăugarea valorii Min.
Acum va primi o valoare în intervalul
[Min,Max)
. Urmând exemplul nostru, care înseamnă[5,10)
:Dar, acest lucru încă nu't includ "Max." și vă sunt obtinerea o valoare dublă. În scopul de a obține "Max." valoare incluse, trebuie să adăugați 1 la gama parametru `(Max - Min) și apoi trunchia partea zecimală prin turnare la un int. Acest lucru este realizat prin intermediul:
Și nu-l ai. Un număr întreg aleator o valoare în intervalul
[Min,Max]
, sau pe un exemplu[5,10]
:Utilizare:
Întreg " x " este acum de numere aleatoare care are un rezultat posibil de 5-10`.
Utilizare:
Cu [tag:java-8] au introdus metoda
int(int randomNumberOrigin, int randomNumberBound)
Aleatoare
clasă.De exemplu, dacă doriți pentru a genera cinci aleatoare de numere întregi (sau unul singur) în intervalul [0, 10], doar face:
Primul parametru indică doar dimensiunea
IntStream
generat (care este supraîncărcat metodă de cea care produce un nelimitatIntStream
).Dacă aveți nevoie pentru a face mai multe apeluri separate, puteți crea o infinitate de primitive iterator de flux:
Puteți face, de asemenea, pentru "dubla" și "lung" valorile.
Sper că vă ajută! :)
Puteți edita doilea exemplu de cod pentru:
Doar o mică modificare de prima soluție ar fi suficient.
Vezi mai multe aici pentru punerea în aplicare a
Aleatoare
La Matematica.Aleatorie clasa în Java 0-based. Deci, dacă ai scrie ceva de genul:
"x" va fi între
0-9
inclusiv.Deci, având în vedere următoarele matrice de 25 de articole, codul pentru a genera un număr aleator între " 0 " (bază de matrice) și matrice.lungimea ar fi:
Din
i.lungime
va reveni25", " de nextInt( am.lungimea ) va returna un număr între intervalul de 0-24
. Cealaltă opțiune este de a merge cu Matematica.Aleatorie care funcționează în același mod.Pentru o mai bună înțelegere, a verifica afară post pe forum Intervale Aleatorii (archive.org).
ThreadLocalRandom echivalent din clasa java.util.Aleatoare pentru mediu multithreaded. Generează un număr aleator este efectuată la nivel local în fiecare dintre fire. Deci, avem o performanță mai bună prin reducerea conflictelor.
x,y - intervale de exemplu (1,10)
Iartă-mă că sunt pretențios, dar soluția sugerată de majoritate, și anume,
min + rng.nextInt(max - min + 1))
, pare periculoasă datorită faptului că:rng.nextInt(n)
nu poate ajunge la Întreg.MAX_VALUE`.Un foarte simplu de manevrat soluție ar returna rezultate corecte pentru orice
min <= max
în cadrul [Întreg.MIN_VALUE
,număr Întreg.MAX_VALUE
]. Luați în considerare următoarele naiv de implementare:Deși ineficiente, rețineți că probabilitatea de succes în anii
în timp ce
bucla va fi întotdeauna de 50% sau mai mare.Acesta poate fi făcut pur și simplu a face declarația:
java Randomizer.genera(0,10); //min de la zero, max de zece
Mai jos este sursa-cod
Randomizer.java
java public class Randomizer { public static int genera(int min,int max) { reveni min + (int)(Math.random() * ((max - min) + 1)); } }
Este doar curat și simplu.
Mă întreb dacă oricare dintre numere aleatoare generarea metode oferite de o [Apache Commons Matematica][matematica] biblioteca s-ar potrivi proiectul de lege.
De exemplu:
RandomDataGenerator.nextInt
sauRandomDataGenerator.nextLong
Să luăm un exemplu.
Să presupunem că am dori pentru a genera un număr între 5-10:
Să ne înțelegem acest...
Genera un număr aleator pentru diferenta dintre min si max, cu ajutorul nextint(n) metoda și apoi se adaugă min număr de rezultat:
Joshua Bloch. Java. A Treia Ediție.
Pornind de la Java 8
Pentru furca se alătura piscine și fluxuri paralele, folosesc SplittableRandom` care este, de obicei, mai repede, are o mai bună independență statistică și uniformitatea proprietăți în comparație cu "Aleator".
Pentru a genera aleatoriu un
int
în intervalul[0, 1_000]:
Pentru a genera aleatoriu un
int[100]
matrice de valori în intervalul[0, 1_000]:
Pentru a returna un Flux de valori aleatoare:
Aceste metode ar putea fi convenabil de a folosi:
Aceasta metoda va returna un număr aleator între furnizate min și max valoare:
si aceasta metoda va returna un număr aleator la furnizate min și max valoare (deci număr generat ar putea fi, de asemenea, min sau max număr):
În caz de rulare un zar ar fi număr aleator între 1 la 6 (nu de la 0 la 6), astfel:
Sau de a lua o privire la RandomUtils de Apache Commons.
Aici's o clasă de ajutor pentru a genera aleatoriu
int
într-o gamă cu orice combinație, inclusiv/exclusiv limite: