Merhaba. Benim elimde şöyle bir örnek var: Diyelim ki 5 kişi var elimde. Ali, Veli, Hasan, Osman, Ayşe Bu 5 kişiden birini (listede tutuyorum) rastgele seçmek istiyorum ama her birinin seçilme olasılığı farklı. Mesela Ali %40, Veli %10, Hasan %10, Osman %10, Ayşe %30 gibi. C# veya Java ile random fonksiyonunu kullanarak bu olasılıklara göre nasıl rastgele seçim yapabilirim? Her seçim yaptığımda Ali nin çıkma olasılığı en yüksek olmalı.

soruldu: 30 May '13, 08:58

numankaraaslan's gravatar image

numankaraaslan
1.8k253749
cevap kabul oranı: 19%

değiştirildi: 07 Ağu '13, 09:30

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


Algoritma şu şekilde olabilir;

  1. Listedeki elamanların ağırlıkları toplanarak toplam ağırlık bulunur (Bu örnekte 100)
  2. Sıfır ile toplam ağırlık arasında rastgele sayı seçilir
  3. Listede gezilerek rastgele sayıdan elamanların ağırlığı çıkarılır
  4. Random sayı sıfır yada daha az olduğunda listedeki eleman rastgele seçilen elaman olmuş olur.

    double totalWeight = 0.0d;
    
    for (Item item : items) {
        totalWeight += item.weight;
    }
    
    double random = Math.random() * totalWeight;
    
    for (Item item : items) {
        random -= item.weight;
    
        if (random <= 0.0d) {
            return item;
        }
    }
    

10binlik bir döngü ile test ettiğimde dağılım şöyle oldu.

Ali: 4071

Veli: 987

Hasan: 1010

Osman: 951

Ayse: 2981

Test kodunun tamamı burada bulunabilir.

kaynak-1, kaynak-2

permanent link

cevaplandı: 30 May '13, 14:54

Mesut's gravatar image

Mesut
60721017
cevap kabul oranı: 25%

Bu işi yapmanın en doğal yolu, listeye olasılığı kadar isim atmak. Yani listeye, 4 tane Ali, 1 tane Veli, 1 tane Hasan, 1 tane Osman, 3 tane de Ayşe, atıp, rastgele seçerseniz, zaten secilme olasılıkları doğal olarak, istediginiz sekilde olacaktır. (Basit ve doğal). Sizin tek yapmanız gereken random olarak bu oluşan listeden, bir elemanı seçmek, zaten olasılıklar dahil olmuş durumda.

permanent link

cevaplandı: 30 May '13, 09:20

AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

AliRıza Adıyahşi ♦
7.9k146288
cevap kabul oranı: 44%

değiştirildi: 30 May '13, 09:30

milyon tane eleman olsa ram'i şişirir

(31 May '13, 00:54) kodmanyagha kodmanyagha's gravatar image

benim de aklıma geldi aynı sorun ama olasılıklar normalize edilirse en küçük 1 en başlayacak şekilde çok sorun olmaz sanırım. mesesla benim verdiğim örnekte 4-1-1-3 olarak verilebilir.

(31 May '13, 00:58) numankaraaslan numankaraaslan's gravatar image
1

milyon tane eleman, tek tek olsa bile zaten şişirir, yani benim verdiğim örnekteki gibi tekrar etmesine bile gerek yok. @Mesut, cevabı vermiş zaten, baya etkin ve esnek.

(31 May '13, 00:59) AliRıza Adıyahşi ♦ AliR%C4%B1za%20Ad%C4%B1yah%C5%9Fi's gravatar image

random'un sınırlarını paylastırarak bunu ayarlayabilrsin. soyle random'un sınırlarını 1-100 arası yap, if else ile:

ali 1-40 arası

veli 40-50

hasan 50-60

osman 60-70

ayse 70-100

umarım yardımcı olur :]

permanent link

cevaplandı: 30 May '13, 09:18

gturedi's gravatar image

gturedi
2.8k41538
cevap kabul oranı: 26%

değiştirildi: 30 May '13, 09:19

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,076
×238

Soruldu: 30 May '13, 08:58

Görüntüleme: 1,203 kez

Son güncelleme: 07 Ağu '13, 09:30

powered by BitNami OSQA