SORU
28 EKİM 2010, PERŞEMBE


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
28 EKİM 2010, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • chrmoe

    chrmoe

    7 Kasım 2006
  • jocc talking shit

    jocc talking

    6 NİSAN 2007