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 1000
tekrarlanmayan 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, Math
sı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()
0
Bu 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ışı |
---|---|
|
|
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ışı |
---|---|
|
|
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ışı |
---|---|
|
|
Şimdi bu mükemmel!
3. Random
sınıf
Random
Java , 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.0
Bu 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.0
Aynı 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)
. 0
aralığa dahildir, ancak max
değ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, -2147483648
ile 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 boolean
değer döndürür: false
veya 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.0
Bu 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.5
aralığın sonundaki değerlerden daha sık oluşur.
Bizim durumumuzda, değer dağılımının zirvesi0.5