Yineleme yok ile oluşturmak rasgele sayılar
Bu durumda, MAX 5, çiftleri tek tek kontrol edin, ama ne kadar basit bir şekilde bu olabilir mi? olabilir. Eğer MAX 20 değeri varsa örneğin, ne? Teşekkürler.
int MAX = 5;
for (i = 1 , i <= MAX; i )
{
drawNum[1] = (int)(Math.random()*MAX) 1;
while (drawNum[2] == drawNum[1])
{
drawNum[2] = (int)(Math.random()*MAX) 1;
}
while ((drawNum[3] == drawNum[1]) || (drawNum[3] == drawNum[2]) )
{
drawNum[3] = (int)(Math.random()*MAX) 1;
}
while ((drawNum[4] == drawNum[1]) || (drawNum[4] == drawNum[2]) || (drawNum[4] == drawNum[3]) )
{
drawNum[4] = (int)(Math.random()*MAX) 1;
}
while ((drawNum[5] == drawNum[1]) ||
(drawNum[5] == drawNum[2]) ||
(drawNum[5] == drawNum[3]) ||
(drawNum[5] == drawNum[4]) )
{
drawNum[5] = (int)(Math.random()*MAX) 1;
}
}
CEVAP
En basit şekilde sayılar (1..20 ya da her neyse) bir listesini oluşturmak ve Collections.shuffle
ile karışık olacaktır. Sadece ancak çok istiyorsan al o zaman. Eğer bu aralık sonunda gereken öğelerin sayısı eşit ise büyük (bir deste iskambil kağıdı karıştırma gibi).
Eğer (ki) 1..10,000 - gereksiz yere bir sürü iş yapmak zorunda kalırsın aralığında 10 rasgele öğeleri istiyorsanız çok iyi çalışmıyor. Bu noktada, muhtemelen daha iyi şimdiye kadar ürettiğiniz değerler tutmak, ve sadece bir sonraki zaten mevcut değil kadar bir döngü oluşturuluyor numaraları saklamak için:
Random rng = new Random(); // Ideally just create one instance globally
// Note: use LinkedHashSet to maintain insertion order
Set<Integer> generated = new LinkedHashSet<Integer>();
while (generated.size() < numbersNeeded)
{
Integer next = rng.nextInt(max) 1;
// As we're adding to a set, this will automatically do a containment check
generated.add(next);
}
Set seçimi ile dikkatli olun - çok kasıtlı olarak verdiğimiz ekleme amacıyla, tutar olarak LinkedHashSet
burada kullandım.
Henüz başka bir seçenekher zamanilerleme, çeşitlilik her zaman azaltarak ve mevcut değerlerini dengeliyor. Yani, örneğin, aralıktaki değerleri 3 9..0 istedin sanırım. Aralığında herhangi bir sayı oluşturmak istiyorum ilk yinelemenin 0..9 - hadi bir 4 oluşturmak demek.
İkinci yineleme aralığı 8..0 bir sayı oluşturmak istiyorum. Eğer üretilen sayı olarak devam etsen 4, daha az ise... başka bir tane ekleyin. Sen olmadan 4 0..9 sonuç bir dizi alır. 7 o şekilde hallederiz sanırım.
Üçüncü yinelemenin aralığında bir sayı 7..0 oluşturmak istiyorum. Eğer üretilen sayı tut 4, daha az ise. Eğer 4 ya da 5, bir tane ekleyin. Eğer 6 ya da 7, iki ekleyin. Sonuç aralığı bu şekilde 4 veya 6 olmadan 0..9'dur.
Tam sayılar rasgele liste oluşturmak P...
Rasgele sayılar don't çok rastgel...
Oluşturmak rasgele bir dizi tamsayı...
O (non-yinelenen) benzersiz rasgele sa...
5 rasgele bir karakter dizesi oluşturm...