Java-da müəyyən bir sıra təsadüfi tam ədəd yaratmaq üçün necə?

Xüsusi bir sıra təsadüfi int dəyərini necə yaratmaq olar?

Aşağıdakıları sınamışam, amma işə yaramır:

Təcrübə 1:

 randomNum = minimum + (int)(Math.random() * maximum); // Bug: 'randomNum' can be bigger than 'maximum'. 

Təcrübə 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'. 
2994
12 дек. 12 dekabr tarixində user42155 tərəfindən təyin olundu 2008-12-12 21:20 '08 saat 21:20 'də, 2008-12-12 21:20
ответ 61 cavab
  • 1
  • 2
  • 3

Java 1.7 və ya daha sonra, bunu etmək üçün standart yol belədir:

 import java.util.concurrent.ThreadLocalRandom; // nextInt is normally exclusive of the top value, // so add 1 to make it inclusive int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1); 

Əlaqədar JavaDoc baxın. Bu yanaşmanın üstünlüyü, düzgün istifadə edilmədikdə, qarışıqlıq və səhv mənbəyi ola bilən java.util.Random nümunəsini açıq şəkildə işə salmağa ehtiyac yoxdur.

Bununla belə, əksinə, toxumu açıq şəkildə müəyyən etmək mümkün deyildir, belə ki, nəticələrin faydalı olduğu hallarda, məsələn, test vəziyyətində və ya oyun vəziyyətini və ya oxşar vəziyyətdə saxlayanda çətinləşdirə bilər. Bu cür hallarda, aşağıda göstərilən Java-dan əvvəl 1.7 üsulu istifadə oluna bilər.

Java 1.7-dən əvvəl, bunu etmək üçün standart üsul aşağıdakılardır:

 import java.util.Random;  public static int randInt(int min, int max) { // NOTE: This will (intentionally) not run as written so that folks // copy-pasting have to think about how to initialize their // Random instance. Initialization of the Random instance is outside // the main scope of the question, but some decent options are to have // a field that is initialized once and then re-used as needed or to // use ThreadLocalRandom (if using at least Java 1.7). // // In particular, do NOT do 'Random rand = new Random()' here or you // will get not very good / not very random results. Random rand; // nextInt is normally exclusive of the top value, // so add 1 to make it inclusive int randomNum = rand.nextInt((max - min) + 1) + min; return randomNum; } 

Əlaqədar JavaDoc baxın. Praktikada java.util.Random sinfi java.> üçün tez-tez üstünlük təşkil edir.

Xüsusən, tapşırıq yerinə yetirmək üçün standart kitabxanada sadə bir API olduqda, təsadüfi tam ədədlərin nəsil təkərini yenidən yaratmağa ehtiyac yoxdur.

12 дек. Greg Davası tərəfindən verilmiş cavab 12 Dekabr. 2008-12-12 21:25 '08 at 21:25 2008-12-12 21:25

nextInt ki, bu yanaşma daha nextIntnextInt yanaşmasından daha az təsirli, on123.ru.site/questions/1788 / ...

Bunun üçün bir standart şablon:

 Min + (int)(Math.random() * ((Max - Min) + 1)) 

Java Math Math.random () kitabxana funksiyası [0,1) diapazonunda cüt dəyər yaradır. Xahiş edirik, bu aralığa 1 daxil deyildir.

Əvvəlcə müəyyən bir sıra dəyərləri əldə etmək üçün, əhatə etmək istədiyiniz dəyərlər aralığının dəyərinə görə çoxaltmaq lazımdır.

 Math.random() * ( Max - Min ) 

Bu, "Max-Min" daxil deyildir [0,Max-Min) üçündür üçündür.

Məsələn, isterseniz [5,10) , istifadə etdiyiniz üçün beş tam dəyərləri əhatə [5,10)

 Math.random() * 5 
border=0

Bu, 5-ə daxil edilməyən yerdə [0,5) aralığında bir dəyər qaytarır.

İndi bu aralığın hədəf alan aralığa keçməsi lazımdır. Min dəyəri əlavə edərək bunu edərsiniz.

 Min + (Math.random() * (Max - Min)) 

Artıq [Min,Max) aralığında bir dəyər alacaqsınız. Bizim [5,10) sonra bu [5,10) deməkdir:

 5 + (Math.random() * (10 - 5)) 

Amma bu hələ Maxə daxil deyil və ikiqat dəyər qazanırsınız. Max dəyərini almaq üçün, sıra parametrinizə (Max - Min) 1 əlavə etməlisiniz və int üçün inteqrasiya edərək onlu hissəni kəsməlisiniz. Bu, aşağıdakılardan ibarətdir:

 Min + (int)(Math.random() * ((Max - Min) + 1)) 

Və burada var. Rəqəmsal tam ədədi [Min,Max] və ya nümunədə [5,10] aralığında:

 5 + (int)(Math.random() * ((10 - 5) + 1)) 
1347
12 дек. Cavab TJ_Fischer 12 dekabr verilir. 2008-12-12 21:35 '08 saat 09:35 'da 2008-12-12 21:35

İstifadə edin:

 Random ran = new Random(); int x = ran.nextInt(6) + 5; 

Tam x bir təsadüfi ədəddir və nəticədə 5-10 nəticəsi ola bilər.

317
04 сент. cavab jackson 04 sep verilir . 2009-09-04 07:23 '09 at 07:23 'da 2009-09-04 07:23

İstifadə edin:

 minimum + rn.nextInt(maxValue - minvalue + 1) 
130
12 дек. Cavab krosenvold 12 dekabr. 2008-12-12 21:25 '08 at 21:25 2008-12-12 21:25

Random sinifdə ints(int randomNumberOrigin, int randomNumberBound) metodunu ints(int randomNumberOrigin, int randomNumberBound) həyata keçirmişlər.

Məsələn, beş təsadüfi tamsayı (və ya bir) [0, 10] aralığında yaratmaq istəyirsinizsə, sadəcə olaraq:

 Random r = new Random(); int[] fiveRandomNumbers = r.ints(5, 0, 11).toArray(); int randomNumber = r.ints(1, 0, 11).findFirst().getAsInt(); 

Birinci parametr yalnız yaradılan IntStream in ölçüsünü (məhdud IntStream yaratan birinin aşırı yüklənmiş metodu) ifadə edir.

Bir neçə ayrı çağırışa ehtiyacınız varsa, axından sonsuz primitiv iterator yarada bilərsiniz:

 public final class IntRandomNumberGenerator { private PrimitiveIterator.OfInt randomIterator;  public IntRandomNumberGenerator(int min, int max) { randomIterator = new Random().ints(min, max + 1).iterator(); }  public int nextInt() { return randomIterator.nextInt(); } } 

Bunu doublelong dəyərlər üçün də edə bilərsiniz.

Ümid edirəm bu kömək edir :)

103
26 нояб. Cavab Alexis C tərəfindən verilir. 26 noyabr. 2014-11-26 21:29 '14 da 21:29 2014-11-26 21:29

İkinci kodunuzun nümunəsini aşağıdakı kimi təşkil edə bilərsiniz:

 Random rn = new Random(); int range = maximum - minimum + 1; int randomNum = rn.nextInt(range) + minimum; 
92
12 дек. 12 dekabrda Bill Lizard tərəfindən cavab verilir . 2008-12-12 21:31 '08 at 21:31 pm 2008-12-12 21:31

İlk qərarınızın kiçik bir dəyişməsi kifayətdir.

 Random rand = new Random(); randomNum = minimum + rand.nextInt((maximum - minimum) + 1); 

Random tətbiq haqqında ətraflı oxuyun

91
13 марта '15 в 1:44 2015-03-13 01:44 Cavab hexabunny mart 13 '15 da 1:44 'də verilir 2015-03-13 01:44

ThreadLocalRandom, çox işıqlı mühit üçün java.util.Random sinifinin ekvivalentidir. Rastgele sayı nəsli hər axında yerli olaraq həyata keçirilir. Beləliklə, münaqişələrin azaldılması ilə biz daha yaxşı fəaliyyət göstəririk.

 int rand = ThreadLocalRandom.current().nextInt(x,y); 

məsələn, x, y aralıkları. (1.10)

58
13 февр. Cavab 13 fevralda Andrew tərəfindən verilir. 2013-02-13 02:19 '13 da 2:19 2013-02-13 02:19

Java Math.Random sinifi 0-a əsaslanır. Beləliklə, belə bir şey Math.Random :

 Random rand = new Random(); int x = rand.nextInt(10); 

x 0-9 arasında olacaq.

Beləliklə, 25 elementdən ibarət olan aşağıdakı array verildikdə 0 (array bazası) və array.length arasında təsadüfi bir sıra yaradan kod:

 String[] i = new String[25]; Random rand = new Random(); int index = 0; index = rand.nextInt( i.length ); 

i.length 25 - i.length qaytardığından, nextInt( i.length ) 0-24 aralığına qədər bir sıra qaytarır. Başqa bir seçim eyni şəkildə işləyən Math.Random ilə gəlir.

 index = (int) Math.floor(Math.random() * i.length); 

Daha yaxşı bir anlayış üçün forum mesajlarını təsadüfi aralıklarla oxuyun (archive.org) .

56
08 янв. Cavab Matt R Jan 08 tərəfindən verilir 2009-01-08 18:04 '09 at 18:04 'da 2009-01-08 18:04

Çətinliyə görə məni bağışla, lakin əksəriyyət tərəfindən təklif edilən həll, min + rng.nextInt(max - min + 1)) təhlükəli görünür, çünki:

  • rng.nextInt(n) Integer.MAX_VALUE çata Integer.MAX_VALUE .
  • (max - min) mənfi olduqda (max - min) aşa bilər.

Integer.MIN_VALUE bir qərar, hər hansı bir min <= max daxilində [ Integer.MIN_VALUE , Integer.MAX_VALUE ] üçün düzgün nəticələr Integer.MAX_VALUE . Aşağıdakı sadəlövh tətbiqi düşünün:

 int nextIntInRange(int min, int max, Random rng) { if (min > max) { throw new IllegalArgumentException("Cannot draw random int from invalid range [" + min + ", " + max + "]."); } int diff = max - min; if (diff >= 0  diff != Integer.MAX_VALUE) { return (min + rng.nextInt(diff + 1)); } int i; do { i = rng.nextInt(); } while (i < min || i > max); return i; } 

Bir müddətli dövrdə müvəffəqiyyət dərəcəsi həmişə 50% və ya daha yüksək olacaqdır.

45
10 янв. Joel Sjöstrand tərəfindən verilmiş cavab 10 yanvar 2011-01-10 16:19 '11 at 16:19 2011-01-10 16:19

Apache Commons Math kitabxanası tərəfindən verilən təsadüfi sayda nəsil üsulu sayılması üçün uyğun olub olmadığını təəccüb edirəm.

Məsələn: RandomDataGenerator.nextInt və ya RandomDataGenerator.nextLong

27
12 дек. Cavab Chinnery 12 dekabr verilir. 2008-12-12 21:27 '08 saat 21:27 'da 2008-12-12 21:27

Bir nümunə götür.

5-10 arasında bir sıra meydana gətirməyi düşünürəm:

 int max = 10; int min = 5; int diff = max - min; Random rn = new Random(); int i = rn.nextInt(diff + 1); i += min; System.out.print("The Random Number is " + i); 

Bunu anlayaq ...

Maks dəyəri ən yüksək dəyəri ilə ən aza endir.

İndi biz mümkün qədər çox mümkün dəyərlərin müəyyənləşdirilməsini müəyyənləşdirməliyik. Bu nümunə üçün:

5, 6, 7, 8, 9, 10

Beləliklə, max - min + 1 olacaqdır.

yəni, 10 - 5 + 1 = 6

Təsadüfi bir sıra 0'dan 5-ə qədər bir sıra yaradır.

yəni, 0, 1, 2, 3, 4, 5

Minimum dəyəri təsadüfi bir sıra əlavə etməklə nəticələnəcəkdir:

5, 6, 7, 8, 9, 10

Nəticədə istənilən aralığa sahibik.

26
03 авг. Cavab Sunil Chawla 03 aug tərəfindən verilir . 2014-08-03 06:07 '14 'da 06:07 ' de 2014-08-03 06:07
  rand.nextInt((max+1) - min) + min; 
23
12 дек. 12 Mayda Michael Myers tərəfindən verilmiş cavab 2008-12-12 21:25 '08 at 21:25 2008-12-12 21:25

Növbəti (n) metodu istifadə edərək, min və maks arasındakı fərq üçün təsadüfi bir sıra yaradın və minimum sayını nəticəyə əlavə edin:

 Random rn = new Random(); int result = rn.nextInt(max - min + 1) + min; System.out.println(result); 
19
27 мая '15 в 13:43 2015-05-27 13:43 cavab gifpif verilir 27 May '13 at 13:43 2015-05-27 13:43

Burada hərtərəfli / müstəsna sərhədlərin hər hansı bir kombinasiyası ilə bir sıra təsadüfi ints yaradan faydalı bir sinifdir:

 import java.util.Random; public class RandomRange extends Random { public int nextIncInc(int min, int max) { return nextInt(max - min + 1) + min; } public int nextExcInc(int min, int max) { return nextInt(max - min) + 1 + min; } public int nextExcExc(int min, int max) { return nextInt(max - min - 1) + 1 + min; } public int nextIncExc(int min, int max) { return nextInt(max - min) + min; } } 
19
15 февр. 15 Fevralda Garrett Hall tərəfindən verildi . 2012-02-15 19:19 '12 saat 19:19 'da 2012-02-15 19:19

Bir sümüyü yivləndirmək vəziyyətində, bu 1 ilə 6 arasında təsadüfi bir sıra (0-dan 6-a qədər deyil), beləliklə:

 face = 1 + randomNumbers.nextInt(6); 
17
16 февр. Cavab 16 fevralda Sam tərəfindən verilir. 2010-02-16 11:50 '10 at 11:50 2010-02-16 11:50

Bu üsullardan istifadə etmək rahat ola bilər:

Bu üsul verilən minimum və maksimum dəyərlər arasında təsadüfi bir sıra qaytarır:

 public static int getRandomNumberBetween(int min, int max) { Random foo = new Random(); int randomNumber = foo.nextInt(max - min) + min; if (randomNumber == min) { // Since the random number is between the min and max values, simply add 1 return min + 1; } else { return randomNumber; } } 

və bu üsul verilən minimum və maksimum dəyərlərdən təsadüfi sayda qayıdacaqdır (bu səbəbdən yaranan rəqəm də minimum və ya maksimum sayda ola bilər):

 public static int getRandomNumberFrom(int min, int max) { Random foo = new Random(); int randomNumber = foo.nextInt((max + 1) - min) + min; return randomNumber; } 
17
12 авг. Cavab Luke Taylor 12 aug. 2012-08-12 18:01 '12 saat 18:01 'da 2012-08-12 18:01

Java 7-də başlayaraq, Random istifadə etməməlisiniz. Ən çox tətbiq üçün, təsadüfi saylı generator GeneratorLeveldir.

SplittableRandom havuzu və paralel mövzuları üçün SplittableRandom istifadə SplittableRandom .

Joshua Bloch. Effektiv java. Üçüncü nəşr.

Java ilə başlayan 8

SplittableRandom və paralel iplər üçün, bir qayda olaraq, daha sürətli olan, SplittableRandom istifadə Random ilə müqayisədə daha yaxşı statistik müstəqil və vahid xüsusiyyətlərə malikdir.

Aralığında təsadüfi int yaratmaq üçün [0, 1_000]:

 int n = new SplittableRandom().nextInt(0, 1_001); 

[0, 1_000]: aralığında təsadüfi int[100] dəyərləri yaratmaq üçün [0, 1_000]:

 int[] a = new SplittableRandom().ints(100, 0, 1_001).parallel().toArray(); 

Təsadüfi dəyərlər axını qaytarmaq üçün:

 IntStream stream = new SplittableRandom().ints(100, 0, 1_001); 
17
12 апр. Cavab Oleksandr 12 apr. 2018-04-12 00:54 '18 at 0:54 2018-04-12 00:54
 int random = minimum + Double.valueOf(Math.random()*(maximum-minimun)).intValue(); 

Və ya Apache Commons- dan RandomUtils bir nəzər.

17
12 дек. Cavab 12 Yanvar istifadəçi2427 tərəfindən verilir. 2008-12-12 21:28 '08 at 21:28 2008-12-12 21:28

Bu nümunəni tapdım. Təsadüfi nömrələri yaradın :


Bu nümunədə, təsadüfi tam ədədlər müəyyən bir sıra ilə yaradılır.

 import java.util.Random;  public final class RandomRange { public static final void main(String... aArgs){ log("Generating random integers in the range 1..10."); int START = 1; int END = 10; Random random = new Random(); for (int idx = 1; idx <= 10; ++idx){ showRandomInteger(START, END, random); } log("Done."); } private static void showRandomInteger(int aStart, int aEnd, Random aRandom){ if ( aStart > aEnd ) { throw new IllegalArgumentException("Start cannot exceed End."); } //get the range, casting to long to avoid overflow problems long range = (long)aEnd - (long)aStart + 1; // compute a fraction of the range, 0 <= frac < range long fraction = (long)(range * aRandom.nextDouble()); int randomNumber = (int)(fraction + aStart); log("Generated : " + randomNumber); } private static void log(String aMessage){ System.out.println(aMessage); } } 

Bu sinifin icrasına bir nümunə:

 Generating random integers in the range 1..10. Generated : 9 Generated : 3 Generated : 3 Generated : 9 Generated : 4 Generated : 1 Generated : 3 Generated : 9 Generated : 10 Generated : 10 Done. 
16
07 июня '12 в 13:38 2012-06-07 13:38 Cavab Hospes tərəfindən 07 İyun '13 ' də saat 13:38' da veriləcək 2012-06-07 13:38

Bunu Java 8'de əldə edə bilərsiniz:

 Random random = new Random(); int max = 10; int min = 5; int totalNumber = 10; IntStream stream = random.ints(totalNumber, min, max); stream.forEach(System.out::println); 
15
20 июня '17 в 15:39 2017-06-20 15:39 Cavab Mulalo Madida tərəfindən 20 İyun '17 'də 15:39 2017-06-20 15:39' də verilir

Bir çox təsadüfi ədədə ehtiyac duyduğunuzda, API-də Random sinifini təklif etmirəm. Yalnız çox kiçik bir dövr var. Əvəzinə Mersenne qıvrımını sınayın. Java proqramı var .

15
13 дек. Cavab raupach 13 dekabr verilir. 2008-12-13 13:18 '08 saat 13:18 'da 2008-12-13 13:18
 public static Random RANDOM = new Random(System.nanoTime()); public static final float random(final float pMin, final float pMax) { return pMin + RANDOM.nextFloat() * (pMax - pMin); } 
15
13 июля '11 в 14:31 2011-07-13 14:31 cavab AZ_13 iyul 2011-ci il saat 14: 11-də verilir

Yalnız Random sinifini istifadə edin:

 Random ran = new Random(); // Assumes max and min are non-negative. int randomInt = min + ran.nextInt(max - min + 1); 
14
24 дек. Cavab Prof. Mo 24 dekabrda verilir. 2013-12-24 16:33 '13 'da 16:33' da 2013-12-24 16:33

Başqa bir seçim Apache Commons istifadə etməkdir:

 import org.apache.commons.math.random.RandomData; import org.apache.commons.math.random.RandomDataImpl; public void method() { RandomData randomData = new RandomDataImpl(); int number = randomData.nextInt(5, 10); // ... } 
14
18 янв. Cavab verilir gerardw 18 yanvar. 2012-01-18 19:15 '12 at 19:15 2012-01-18 19:15

Burada açıq bir sıra [min, max]min <= max is true olan təsadüfi bir sıra yaratmağı göstərən sadə bir nümunədir

Random.class bir yerdə bütün üsulları olan, deşiklər sinifində bir sahədə istifadə edə bilərsiniz

Nümunə nəticələr:

 RandomUtils random = new RandomUtils(); random.nextInt(0, 0); // returns 0 random.nextInt(10, 10); // returns 10 random.nextInt(-10, 10); // returns numbers from -10 to 10 (-10, -9....9, 10) random.nextInt(10, -10); // throws assert 

Mənbələr:

 import junit.framework.Assert; import java.util.Random; public class RandomUtils extends Random {  public int nextInt(int min, int max) { Assert.assertFalse("min can't be > then max; values:[" + min + ", " + max + "]", min > max); if (min == max) { return max; } return nextInt(max - min + 1) + min; } } 
14
28 нояб. Cavab Yaqiv Mospan 28 noyabrda verilir . 2014-11-28 03:50 '14 'da 3:50 2014-11-28 03:50

SecureRandom istifadə etmək daha yaxşıdır , yalnız Random deyil.

 public static int generateRandomInteger(int min, int max) { SecureRandom rand = new SecureRandom(); rand.setSeed(new Date().getTime()); int randomNum = rand.nextInt((max - min) + 1) + min; return randomNum; } 
11
26 марта '15 в 16:02 2015-03-26 16:02 Cavab 26 mart 'da 15:00 ' də grep tərəfindən verilir. 2015-03-26 16:02

Yuxarıdakı ən çox səs ilə cavab vermək istəsəniz, bu kodu istifadə edə bilərsiniz:

 public class Randomizer { public static int generate(int min,int max) { return min + (int)(Math.random() * ((max - min) + 1)); } public static void main(String[] args) { System.out.println(Randomizer.generate(0,10)); } } 

Yalnız təmiz və sadədir.

11
01 сент. Abel Callejo tərəfindən 01 Sentyabr 2013-09-01 05:53 '13 'da 5:53 2013-09-01 05:53
 private static Random random = new Random(); public static int getRandomInt(int min, int max){ return random.nextInt(max - min + 1) + min; } 

Və ya

 public static int getRandomInt(Random random, int min, int max) { return random.nextInt(max - min + 1) + min; } 
11
11 февр. Cavab 11 fevral tarixində Məhəmməd Aamir Talib tərəfindən verilir . 2015-02-11 14:40 '15 'da 14:40' de 2015-02-11 14:40
 rand.nextInt((max+1) - min) + min; 

Böyük işləyir.

10
22 февр. Cavab 22 fevralda ganesh tərəfindən verilir . 2010-02-22 14:44 '10 at 2:44 pm 2010-02-22 14:44
  • 1
  • 2
  • 3

bağlı digər suallar və ya sual verin