[]

Yazılım geliştirici arkadaşlarıma algoritma sorusu

Merhaba,

Tamamen örneklendirme ile anlatarak yapacağım. Bu şekilde sizden aldığım kod ile kendime uyarlama yapabileceğimi düşünüyorum.

elimde bir tablo var ve kullanıcıların skorlarını tutuyorum. bu skor miktarı üzerinden de random bir atış yapmak istiyorum ama skoru çok olan kullanıcının şansının daha yüksek olmasını istiyorum. örnek bir tablo verecek olursam eğer şu şekilde olacaktır;

|score | user_id |
| 25 | 1 . |
| 25 | 2 . |
| 10 | 3 . |
| 35 | 4 . |

Burada 4. kullanıcının diğerlerine göre biraz daha şanslı olması gerekiyor. Javascript, Php ya da python fark etmez. burada skoruna göre bana sadece kullanı adını return edecek bir method gerekli. Dependent events konusunda işlenen bir ihtimal durumu oluyor fakat bana return edeceği sadece kullanıcı id'si olması gerekiyor.

Yardımlarınız için teşekkür ederim.

 
ilk aklıma gelen toplama bakılarak toplam range üzerinden random bir sayı seçmek oldu. yani mesela bu 4 score'un toplamı 95. 1-95 arası random bir sayı seçilirse olur gibi.

1-25 - 1
26-50 - 2
51-60 - 3
61-95 - 4
  • tepedeki psychedelic adam  (08.10.19 11:43:52) 
Ilk adim olarak skorlarin OBEB ini alin (evet, okulda ogrendigimiz obeb)
Sonra her kullanici icin skor/OBEB kadar bilet verdiginizi farzedin.
Sonra da rastgele cekilis yapin.

Ornek;
25, 10 ve 35'in OBEB'i 5, her kullaniciya skor/5 adet bilet verecegiz.
score | user_id | bilet
25 | 1 | 1,2,3,4,5
25 | 2 | 6,7,8,9,10
10 | 3 | 11,12
35 | 4 | 13,14,15,16,17,18,19

Simdi 1 ile 19 arasinda rastgele bir numara secebilirsiniz.
  • ekyil  (08.10.19 12:13:07) 
@ekyil ile aynı mantığı söylemeye gelmiştim.


  • emcekare olmadi einstein olsun bari  (08.10.19 12:23:10) 
problemle ilgili güzel gelişme kaydettim özellikle @ekyil sayesinde. şu an kodlarını yaratmaya çalışıyorum ama takılıp kalacağım sanırım bu noktada. biraz karışık bir dizi yaratmam gerekecek, ve 10k kullanıcı söz konusu performans sorunu yaşatmadan işin içinden çıkmam lazım. ek olarak buna bir de hash mekanizması üzeretmem gerekecek, bunu kullanıcılarla paylaşmak zorundayım.


  • kvlknctk  (08.10.19 12:27:56 ~ 12:28:25) 
hangi dili kullandigini soylersen, mutlaka yazilimsal olarak da yardimci olan cikacaktir.


  • ekyil  (08.10.19 12:32:52) 
  • babilbaligi  (08.10.19 13:40:13) 
her bir kullanıcının skorunu 0-1 arası random bir sayı ile çarp sonra en büyük olanın ID sini al, aynı değer çıkması durumunda bu olayı tekrarlat.

olayı daha fazla karmaşıklaştırma

25*randomSayı(0-1)
25*randomSayı(0-1)
10*randomSayı(0-1)
35*randomSayı(0-1)


Örnek Sql;
SELECT TOP 1 ((ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT))) * [SKOR]) as katSayi, [USERID] FROM [USERS] order by katSayi desc
  • kureseltikinma  (08.10.19 14:53:25 ~ 15:17:28) 
obeb/okek gerek yok. running total ile çözersiniz. sql server için; (scoreları önce hareketli topla, sonra 1 ile toplam score arasında rastgele sayı üret, o sayıdan ilk büyük hareketli toplama sahip kaydın user_id'sini getir. her user_id için score kadar şansı var.)

select top 1 user_id from (select user_id, sumscore, sum(sumscore) over(order by user_id rows between unbounded preceding and current row) as runtotal
from(
select user_id , sum(score) as sumscore
from rt_test
group by user_id
) as tbl) x
where runtotal > round(((select sum(score) from rt_test) * rand()+1), 0)
order by user_id
  • altinci nesil caylak  (08.10.19 14:55:08 ~ 14:57:22) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.