Salam. Hazırda realizasiyası JAVA-da maraqlı olsa da, məncə istənilən proqramlaşdırma dilində buna uyğun alqoritm göstərsəniz, mənə aydın olar. Çoxunuz kompüter, smartfon və s. sistemlərdə oyunlar oynamısınız. Belə bir hissə var. Məsələn: Yol ilə gedirsiniz, sizin qarşınıza 10% şans var ki, bonus qutusu çıxacaq, 1% şans var ki, bu qutudan +1 can, 2 % şansla 250 qızıl, 5% şansla paltar, 70% şansla 1qızıl, 0.01% şansla isə 250 qızıl + paltar çıxa bilər. Maraqlı hissə də budur. Şans sistemini necə qurmaq olar? Əslində fikrim var, ancaq çox kustar üsuldur. Yəqin ki, güləcəksiniz. Ancaq heç bu da işimə yaramır əslində:
Məsələn: 5% üçün
int[] a={2,14,66,72,86};
Random() la rəqəm alırıq 1-100 arası, əgər alınan rəqəm a massivində varsa, bunu 5 % lik şans saymaq olar. Ancaq faiz şansları çox olduqda gərək mən 50%ə qədər bütün şanslar üçün belə sistem qurum. Bu zaman gərək elə edim ki, bir massivdə olan rəqəmlər başqasında olmasın. Bu isə mümkün deyil heç bir cəhətdən. Zəhmət olmasa, kömək edin. Öncədən təşəkkür edirəm.
Verilmiş cavablar və yazılan şərhlər (15 cavab var)
1
Salam. 1..100 random qiymətlər alırsa
if else və ya case ilə yoxlayırıq
Əgər həmin ədəd
0
Bax qutudan faizlərdə yazdıqlarımdan biri çıxmalıdır. əgər 7 qaytarsa Random() o zaman mən hansı bonusu seçməliyəm? 5dən böyük 45=< dir 7. Ancaq bu aralığa başqa faizlər də daxildir. Mənə isə lazımdır ki, düşən rəqəm faizi təyin etsin, o faizlə mən bonusu təyin edəcəm. Bəlkə də, düzgün qurmuram sistemi beynimdə.
0
Yoox. 1-dən 100-ə olan random ədədlərlə faizin heç bir əlaqəsi yoxdur.
Sən bölgünü aparırsan və bölgünün uzunluğu faizi təyin eidr. Daha random ədəd 93-dürsə, bunun 93%lə əlaqəsi yox. 93 hansı intervaldadırsa o faizlə əlaqəsi var. Formal yazım:
və.s. 0.01% tipli faizlər də varsa o halda bölgü random(1,10 000) arası aparılmalıdır ki, diskret addım 1 yox, 0.01 olsun
0
iş ondadır ki, 1-100 arası düşən rəqəmin şansı elə 1% dir. Yəni ki, 11 rəqəminin düşmə ehtimalı artıq 1%dir elə. Gərək bunu mövzunun özündə qeyd edərdim. Yəni sizin variantı istifadə etsək, buna “Koreya randomu” deyirlər, bir çox Koreya istehsalı olan oyunlarda rast gəlinir. Mən bu səbəbdən, 5% lik şansı təyin edən massivdə 5 ədəd göstərmişəm.
0
Fikir tam çatmadı bəlkə ona görə anlaşılmazlıq var nəsə.
Amma tam əmin ola bilərsən ki “Belə bir hissə var. Məsələn: Yol ilə gedirsiniz, sizin qarşınıza 10% şans var ki, bonus qutusu çıxacaq, 1% şans var ki, bu qutudan +1 can, 2 % şansla 250 qızıl, 5% şansla paltar, 70% şansla 1qızıl, 0.01% şansla isə 250 qızıl + paltar çıxa bilər.” Bunun həlli mən yazandır. Şans-ehtimal işləri ilə çox məşğul oluram elmi işlərdə 🙂 Nəinki sadə random, hətta loqarifmik ifadələrlə olan mürəkkəb ehtimal paylanmaları ilə(çayın daşması, əhalinin artımı və.s. ehtimallar) Yəni məsələ tam aydın olsa, əminəm ki izahın verə bilərəm 🙂
0
Yaxşı belə deyək:
Ümumi oyunda 1% dən tutmuş 100%ə qədər şanslar ehtimalı var. Mən necə əmin ola bilərəm ki, random() 22 qaytarıbsa bu 33%-lik şansdır. Çünki Random(1,101) versək min dəfəlik iterasiyaya o zaman təxmini 10 dəfə 1, 10 dəfə 2, 10 dəfə 3 , …. , 10 dəfə 100 düşəcək. Belədir ki, Random()-un 22 qaytarmağı (1və 100 arası rəqəmlərdən) cəmi 1%-dir. O zaman 22 olursa random() və bu 22-ni 33%-lik şansa aid etməyim düzgün deyil axı.
0
Axı niyə 1000 dəfəlik təkrar cəhdlər edirsən? Bunu anlamadım.
Random(a,b)-də hər bir integerin düşmə ehtimalı 1/(b-a+1)-dır. Yəni istər 22 olsun, istər 99. Bizə lazım olan ehtimalları intervalın uzunluğu ilə təyin edirik. 22 qaytarıbsa bu 33%-lik şansdır ifadəsi yanlışdır.
Biz özümüz əgər təyin etsən ki,
if a böyükdür bərabərdir 1 və a kiçikdir 33, onda 33%lik hadisə baş versin – Bəli o halda random(1,100)-ün qiyməti 1-dən 33-dək istənilən qiyməti aldıqda 33%-lik ehtimallı hadisə baş verir.
Çünki 1-dən 33-ə 33 eyniehtimallı mümkün hadisə var. Və bunlar cəmlənir. Düstura görə alırıq: 33*(1/(100-1+1))=33%.
22 də o intervala daxildir deyə hər dəfə random(1,100)= 22 olsa, və ya 20, 30, 32 və.s. olsa(hansı ki kiçikdirlər 33-dən), deməli 33%lik hadisə baş verir
0
Eləyə qalsa onda 5 düşdüsə 5% lik şansa bərabər edək, 34 düşsə 34%? Çünki 33 düşübsə o zaman bu 31%ə daxil olmayacaq,32% daxil olmayacaq çünki 33% bunlardan böyükdür, 33-ə bərabər edək? Beynim qarışdı lap 🙂 Deitel-in kitabından bir kod parçası göstərim. 6 üzlü zər atılır, zərin hər üzünün düşmə sayını göstərir.
2 dəfə proqramı run edək. Nəticələr:
Face Frequency
1 999501
2 1000412
3 998262
4 1000820
5 1002245
6 998760
2-ci dəfə
Face Frequency
1 999647
2 999557
3 999571
4 1000376
5 1000701
6 1000148
0
Ikinci şərhimdə yazmışdım ki 5 klə 5%in 35 ilə 35%in bem bir əlaqəsi yoxdur 🙂 ehtimal intervalla hesablanır. Əslində məsələ sadə şeydir, nədənsə təsvirini çətun verirsən
0
Şansların-ehtimalların cəmi 100% olmalıdır, 1-dən 100%-ə qədər ayrı-ayrı şans müəyyən edə bilməzsən
1
1. Əvvəlcə yalnız tam faizlərə baxaq:
10% – bq, 1% – can, 2% – 205qizil, 5% – paltar, 70% 1qizil
Bir massiv götürürsünüz [ ‘bq’ {10 dəfə təkrarla}, ‘can’, ‘205qizil’, ‘205qizil’, ‘paltar'{5 dəfə təkrarla}, ‘1izil'{100 dəfə təkrarlar} ]
İndi bu array-dan random bir element seçin bu sizin tələblərə uyğun element olacaq.
2. Tam sizin tələblərlər, yəni onluq faiz də daxil olmaqla.
Bunun üçün əvvəlcə bütün faiz göstərən ədədlərinizi 100-ə vurun(0.01 i tam ədədə gətirmək üçün) sonra isə birinci bənddə dediyimi tətbiq edin
Uğurlar!
0
Elə indicə buna oxşar bir variant fikirləşirdik. Ancaq bu mən istəyənə çox yaxın bir ideyadır. Təşəkkür edirəm. Bircə sual qalır.Belə çıxır ki massivin bu misalda təxmini 80+ elementi olacaq. Bu yaddaşı zəbt etməyə gətirib çıxarmaz ki bir massivlə?
1
Java -da səhv eləmirəmsə short integer yaddaşda 2 byte yer tutur. Hətta məncə bu məsələyə byte-da bəs edər hansıki 1 byte yaddaş tutur. Yəniki misal üçün siz byte array-ı düzəldə bilərsiniz və hər bir hədiyyəni bir rəqəmlə işarələyə bilərsiniz. Array da isə string-i yox bu rəqəmi təkrar edərsiniz bu zaman misal üçün arrayın 512 elementi olsa cəmi 1kb yaddaş istifadə etmiş olursunuz. Yəniki heç bir problem olmuyacaq, əgər kompüter üçün yazılırsa proqram elə stringləri təkrarlamaqda problem deyil.
0
Necə deyərlər proof test 🙂
1dəfə run:
Face Frequency
1 101700
2 302895
3 595405
2-ci run
Face Frequency
1 100909
2 303506
3 595585
3-cü run
Face Frequency
1 100325
2 303985
3 595690
0
array=new int[132]; yox array=new int[100]; olacaq əslində. Öncəki testdən qalıb 132. ÜMumilikdə 3 elementdir. 1ci bonusun düşmə faizi 10%,2cinin 30%,3cünün 60%. Nəticəni də elə alırıq təxmini.
Sual verin
Cavab verin