[]
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.
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
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.
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)
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
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
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