1. Sözde rasgele sayılar

Bazen bir programcı görünüşte basit görevlerle karşı karşıya kalır: "belirli bir listeden rastgele bir film seçin", "piyango kazananı seçin", "kullanıcı akıllı telefonunu salladığında oynatma listesini karıştırın", "bir mesajı şifrelemek için rastgele bir sayı seçin" , vb. Her durumda, geliştirici mantıklı bir soru sorar: rastgele bir sayı nasıl elde edilir?

Aslında, gerçekten rastgele bir sayı elde etmek oldukça zordur. Aslında, gerçek rasgeleliğin tüm gereksinimlerini karşılayan sayılar üretmek için bazı bilgisayarlara özel matematiksel yardımcı işlemcilerin yerleştirilmesi o kadar zordur.

Programcılar kendi çözümlerini buldular: sözde rasgele sayılar . Sözde rasgele sayılar, sayıları rasgele gibi görünen bir dizi dizidir. Ancak, dikkatli bir analiz gerçekleştiren bir uzman, dizideki belirli kalıpları bulabilir. Bu tür sayılar, gizli belgeleri şifrelemek için uygun değildir, ancak bir oyunda zarın yuvarlanmasını simüle etmek için yeterlidir.

Bir sözde rasgele sayı dizisi oluşturmak için birçok algoritma vardır. Hemen hemen hepsi, önceki sayıya ve bazı ek yardımcı sayılara dayalı olarak bir sonraki rasgele sayıyı üretir.

Örneğin, bu program 1000tekrarlanmayan sayıları gösterecektir:

public class Main
{
   public static int a = 41;
   public static int c = 11119;
   public static int m = 11113;
   public static int seed = 1;

   public static int getNextRandom()
   {
     seed = (a * seed + c) % m;
     return seed;
   }

   public static void main(String[] args)
   {
     for (int i = 0; i < 1000; i++)
     {
       System.out.println(getNextRandom());
     }
   }
}

Bu arada, burada sözde rastgele sayılardan bahsetmiyoruz. Bir dizi sözde rasgele sayılardan bahsediyoruz. Tek bir sayıya bakıldığında rastgele olup olmadığını söylemek imkansızdır.

Aslında, rastgele bir sayı elde etmenin çeşitli yolları vardır:

public static int getRandomNumber()
{
   return 4; // Here's a random number (we got it by rolling a die)
}

2.Math.random()

Java'da, Mathsınıfın rastgele bir sayı döndüren özel bir yöntemi vardır. Ve tahmin edebileceğiniz gibi, yöntemin adı random. Genel olarak, bu yöntemi çağırmak şöyle görünür:

Math.random()

0Bu yöntem hiçbir parametre almaz ve ila arasında sözde rasgele bir gerçek sayı döndürür 1. 1 sayısının kendisi aralığa dahil değildir.

Örnek:

kod Konsol çıkışı
public class Main
{
   public static void main(String[] args)
   {
     for (int i = 0; i < 10; i++)
     {
       System.out.println(Math.random());
     }
   }
}
0.9703753971734451
0.09979423801773157
0.994048474709053
0.2852203204171295
0.13551248551226025
0.3128547131272822
0.5342480554101412
0.6817369932044817
0.1840767788961758
0.06969563435451254

Peki ya bu yöntem tam olarak ihtiyacınız olan şey değilse? Diyelim ki altı kenarlı bir zarın yuvarlanmasını simüle eden bir program yazmak istiyorsunuz. 0..1 aralığında gerçek sayılar yerine 1..6 aralığında rastgele tamsayıları nasıl elde edersiniz?

Aslında oldukça basit.

[0, 1)Öncelikle, aralığı üzerine eşlemeniz gerekir [0, 6). Bunu yapmak için, döndürülen sonucu ile çarpmanız random()yeterlidir 6. Tabii ki, tam sayıları elde etmek için yuvarlamanız gerekir:

kod Konsol çıkışı
public class Main
{
   public static int getRandomDieNumber()
   {
      return (int) (Math.random() * 6);
   }

   public static void main(String[] args)
   {
      for (int i = 0; i < 10; i++)
      {
         int x = getRandomDieNumber();
         System.out.println(x);
      }
   }
}
5
2
3
3
2
4
1
1
5
0

getRandomDieNumber()Dahil olan aralıkta rastgele bir tamsayı döndürür 0..5. Ama kümede bir sayı olmayacak 1, 2, 3, 4, 5, 6. Kümedeki bir sayı olacaktır 0, 1, 2, 3, 4, 5.

Set içindeki sayılara ihtiyacınız varsa 1, 2, 3, 4, 5, 6, rastgele sayılara bir tane ekleyin:

kod Konsol çıkışı
public class Main
{
   public static int getRandomDieNumber()
   {
      return (int) (Math.random() * 6) + 1;
   }

   public static void main(String[] args)
   {
     for (int i = 0; i < 10; i++)
     {
       int x = getRandomDieNumber();
       System.out.println(x);
     }
   }
}
3
2
1
3
6
5
6
1
6
6

Şimdi bu mükemmel!



3. Randomsınıf

RandomJava , bir dizi sözde rasgele sayı içeren özel bir sınıfa sahiptir . Sınıfın birkaç nesnesini oluşturabilirsiniz Random. Bu nesnelerin her biri kendi sözde rasgele sayı dizisini üretecektir.

Bu, pek çok ilginç yöntemi olan süper ilginç bir sınıftır. En basitinden başlayalım.

double nextDouble()

0.0Bu yöntem, - aralığında rastgele bir gerçek sayı döndürür 1.0. Yönteme çok benzer Math.random(). Yöntem, yöntemi basitçe bir nesne üzerinde Math.random()çağırdığı için şaşılacak bir şey yok .nextDouble()Random

float nextFloat()

Bu yöntem, yönteme çok benzer nextDouble(), ancak döndürülen rasgele sayı bir float. 0.0Aynı zamanda - aralığında yer alır 1.0. Ve Java'da her zaman olduğu gibi, aralık sayının kendisini içermez 1.0.

Random r = new Random();
float f = r.nextFloat();

int nextInt(int max)

Bu yöntem , aralıkta rastgele bir tamsayı döndürür [0, max). 0aralığa dahildir, ancak maxdeğildir.

Başka bir deyişle, kümede rastgele bir sayı elde etmek istiyorsanız 1, 2, 3, 4, 5, 6, döndürülen rastgele sayıya bir tane eklemeniz gerekir:

Random r = new Random();
int x = r.nextInt(6) + 1;

int nextInt()

Bu yöntem öncekine benzer, ancak herhangi bir parametre almaz. Öyleyse, dönüş değerlerinin aralığı nedir? . -2 billion_ +2 billion_

Kesin olmak gerekirse, -2147483648ile arasında +2147483647.

long nextLong()

Bu yöntem, yönteme benzer nextInt(), ancak dönüş değeri tüm olası s aralığında bir yere düşecektir long.

boolean nextBoolean()

Bu yöntem rastgele bir booleandeğer döndürür: falseveya true. Bu, uzun bir rasgele boole değerleri dizisi elde etmeniz gerektiğinde çok kullanışlıdır.

void nextBytes(byte[] data)

Bu yöntem hiçbir şey döndürmez (çünkü dönüş türü void). Bunun yerine, geçirilen diziyi rasgele değerlerle doldurur. Rastgele verilerle dolu büyük bir arabelleğe ihtiyacınız olduğunda bu çok kullanışlıdır.

double nextGaussian()

0.0Bu yöntem, - aralığında rastgele bir gerçek sayı döndürür 1.0. Ancak, sayılar bu aralıkta eşit olarak dağılmamıştır. Bunun yerine normal bir dağılım izlerler .

Aralığın ( ) ortasına yakın değerler, 0.5aralığın sonundaki değerlerden daha sık oluşur.

Rastgele sınıf

Bizim durumumuzda, değer dağılımının zirvesi0.5