{"id":178,"date":"2014-04-14T14:10:27","date_gmt":"2014-04-14T12:10:27","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=178"},"modified":"2019-11-08T21:58:22","modified_gmt":"2019-11-08T20:58:22","slug":"szamsorsolas-adott-intervallumbol","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=178","title":{"rendered":"Java programoz\u00e1s 11. &#8211; V\u00e9letlen sz\u00e1mok"},"content":{"rendered":"<h1>V\u00e9letlen sz\u00e1mok, avagy b\u00edzzuk a sorsra<\/h1>\n<p>Programoz\u00e1s sor\u00e1n sokszor el\u0151fordul, hogy valamilyen \u00e9rt\u00e9ket v\u00e9letlenszer\u0171en kell megadni, vagy fel kell t\u00f6lteni egy t\u00f6mb\u00f6t v\u00e9letlen sz\u00e1mokkal. A v\u00e9letlen sz\u00e1m gener\u00e1l\u00e1s\u00e1nak m\u00f3dszere a k\u00f6vetkez\u0151:<\/p>\n<p>El\u0151sz\u00f6r meg kell hat\u00e1rozni annak az intervallumnak a hat\u00e1rait, amelyb\u0151l az adott sz\u00e1mot sorsolni kell:<\/p>\n<p><strong>[0;20]<\/strong><br \/>\n<strong> [10;30]<\/strong><br \/>\n<strong> [-10;10]<\/strong><br \/>\n<strong> [-20;0]<\/strong><br \/>\n<strong> [-40;-20]<\/strong><\/p>\n<p>Ha eg\u00e9sz sz\u00e1mokat akarunk sorsolni, akkor ezek a t\u00edpusok j\u00f6hetnek sz\u00f3ba. A j\u00f3 az eg\u00e9szben az, hogy b\u00e1rmilyen eg\u00e9szeket tartalmaz\u00f3 intervallumra egy \u00e1ltal\u00e1nos &#8220;k\u00e9plettel&#8221; meg lehet adni a sorsoland\u00f3 sz\u00e1mot. El\u0151sz\u00f6r meg kell hat\u00e1rozni az intervallum als\u00f3 \u00e9s fels\u0151 hat\u00e1r\u00e1t. Ha ezeket tudjuk, akkor j\u00f6het a sorsol\u00e1st v\u00e9gz\u0151 programk\u00f3d. Ennek \u00e1ltal\u00e1nos form\u00e1ja a k\u00f6vetkez\u0151:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(int)( Math.random()*(fels\u0151-als\u00f3+1) )+als\u00f3;<\/pre>\n<p>Bontsuk akkor r\u00e9szekre ezt a k\u00f3dot. Kezdj\u00fck bel\u00fclr\u0151l kifel\u00e9 haladva:<\/p>\n<p>A Math.random() f\u00fcggv\u00e9ny egy v\u00e9letlen sz\u00e1mokat gener\u00e1l\u00f3 f\u00fcggv\u00e9ny, mely egy lebeg\u0151pontos sz\u00e1mot (nem eg\u00e9sz) sorsol ki a [0;1[ intervallumb\u00f3l. Nem rontottam el az intervallum z\u00e1r\u00f3jel\u00e9t, ez ugye azt jelenti, hogy a kisorsolt \u00e9rt\u00e9k legkisebb \u00e9rt\u00e9ke nulla, a legnagyobb viszont mindenk\u00e9ppen 1-n\u00e9l kisebb lesz. \u00cdgy is \u00edrhattam volna, hogy a Math.random() f\u00fcggv\u00e9ny ilyen \u00e9rt\u00e9keket sorsol: 0 &lt;= sz\u00e1m &lt; 1<\/p>\n<p>Ezt a sz\u00e1mot meg kell szorozni az intervallum m\u00e9ret\u00e9vel, amit minden esetben \u00fagy kapunk, hogy a fels\u0151 hat\u00e1rb\u00f3l kivonjuk az als\u00f3t \u00e9s 1-et hozz\u00e1adunk. Az egyik p\u00e9ld\u00e1n\u00e1l maradva a [0;10] intervallum m\u00e9rete 11, hiszen 10-0+1 = 11. Mi\u00e9rt adunk hozz\u00e1 egyet? Mert ha csak a k\u00e9t sz\u00e1m k\u00fcl\u00f6nbs\u00e9g\u00e9t venn\u00e9nk, akkor az intervallumba a fels\u0151 hat\u00e1r nem tartozna bele. Mi\u00e9rt? Ha eml\u00e9kszel, a Math.random() 1-et sosem sorsol, ez\u00e9rt az egyik alul r\u00e9szletezett l\u00e9p\u00e9s miatt a fels\u0151 hat\u00e1r kimaradna. Ha ezt az intervallum m\u00e9retet behelyettes\u00edtj\u00fck a megfelel\u0151 helyre egyszer\u0171s\u00f6dik a k\u00e9plet:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(int)(Math.random() * intervallum_m\u00e9rete) + als\u00f3;<\/pre>\n<p>Ha most n\u00e9zz\u00fck a bels\u0151 r\u00e9szt, akkor alakul a dolog. N\u00e9zz\u00fck \u00fajra a p\u00e9ld\u00e1kat imm\u00e1r behelyettes\u00edtve az eddig tanultakat:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n&#x5B;0;20]     (int)(Math.random() * 21) + als\u00f3;\r\n&#x5B;10;30]    (int)(Math.random() * 21) + als\u00f3;\r\n&#x5B;-10;10]   (int)(Math.random() * 21) + als\u00f3;\r\n&#x5B;-20;0]    (int)(Math.random() * 21) + als\u00f3;\r\n&#x5B;-40;-20]  (int)(Math.random() * 21) + als\u00f3;\r\n<\/pre>\n<p>\u00c9rdekes m\u00f3don hab\u00e1r 5 k\u00fcl\u00f6nf\u00e9le t\u00edpust adtam meg intervallumra, az intervallumok m\u00e9rete m\u00e9gis egyforma. Nincs ezzel semmi gond, mert a v\u00e9letlen sz\u00e1m sorsol\u00e1s els\u0151 l\u00e9p\u00e9se a megfelel\u0151 m\u00e9ret\u0171 sorsol\u00e1si intervallum meghat\u00e1roz\u00e1sa, ami ism\u00e9tl\u00e9sk\u00e9pp: <strong>fels\u0151 &#8211; als\u00f3 + 1<\/strong><\/p>\n<p>Ha ez megvan, akkor m\u00e1r csak ezt a megfelel\u0151 m\u00e9ret\u0171 intervallumot kell eltolni a sz\u00e1megyenesen a megfelel\u0151 ir\u00e1nyba \u00fagy, hogy az intervallum als\u00f3 hat\u00e1ra a megfelel\u0151 kezd\u0151pontban legyen. Ez puszt\u00e1n csak annyit jelent, hogy a z\u00e1r\u00f3jelben l\u00e9v\u0151 r\u00e9szhez a <strong>z\u00e1r\u00f3jelen k\u00edv\u00fcl<\/strong> &#8211; hozz\u00e1adom az intervallum als\u00f3 hat\u00e1r\u00e1t (ami negat\u00edv \u00e9rt\u00e9k eset\u00e9n term\u00e9szetesen kivon\u00e1st jelent). L\u00e1ssuk \u00edgy a megold\u00e1sokat:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n&#x5B;0;20]     (int)(Math.random() * 21); \/\/ a null\u00e1t nem adom hozz\u00e1\r\n&#x5B;10;30]    (int)(Math.random() * 21) + 10;\r\n&#x5B;-10;10]   (int)(Math.random() * 21) - 10;\r\n&#x5B;-20;0]    (int)(Math.random() * 21) - 20;\r\n&#x5B;-40;-20]  (int)(Math.random() * 21) - 40;\r\n<\/pre>\n<p>Ezzel m\u00e1r majdnem k\u00e9szen is vagyunk, de m\u00e9g ott van egy fura r\u00e9sz a k\u00f3d elej\u00e9n: <strong>(int) <\/strong>Ez az \u00fagynevezett <strong>t\u00edpusk\u00e9nyszer\u00edt\u00e9s,<\/strong> angolul typecast. Ez azt jelenti, hogy a k\u00f6zvetlen\u00fcl ut\u00e1na szerepl\u0151 \u00e9rt\u00e9knek k\u00f6zvetlen\u00fcl megmondja, hogy milyen t\u00edpusa legyen. A Math.random(), ha eml\u00e9kszel, egy lebeg\u0151pontos (val\u00f3s) sz\u00e1mot sorsolt, ami nem eg\u00e9sz, de az intervallum eg\u00e9sz sz\u00e1mokat kell, hogy tartalmazzon. Ezzel megadtuk, hogy az <strong>(int)<\/strong> ut\u00e1n l\u00e9v\u0151 sz\u00e1m legyen eg\u00e9sz, ami val\u00f3j\u00e1ban azt jelenti, hogy lev\u00e1gjuk a tizedesjegyeket.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(int)(Math.random() * 21) - 20;<\/pre>\n<p>\u00cdgy lesz az intervallum m\u00e9rete eg\u00e9sz sz\u00e1m, hiszen eredetileg a [0;21[ intervallumb\u00f3l b\u00e1rmilyen val\u00f3s sz\u00e1m lehetett volna.<\/p>\n<p>Fontos m\u00e9g megjegyeznem, hogy az intervallum eltol\u00e1sakor az als\u00f3 hat\u00e1r hozz\u00e1ad\u00e1s\u00e1t mindenk\u00e9pp \u00fagy adjuk meg, ahogy a p\u00e9ld\u00e1ban l\u00e1tjuk. T\u00f6bb helyen ilyen megold\u00e1ssal tal\u00e1lkoztam, amik rosszak:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(int)(Math.random() * 21 - 40);<\/pre>\n<p>Ez a megold\u00e1s az\u00e9rt rossz, mert a csonkol\u00e1s \u00e9s az intervallum negat\u00edv tartom\u00e1nyba tol\u00e1sa miatt az als\u00f3 hat\u00e1r (a p\u00e9ld\u00e1ban a -20) sosem szerepelhet a sorsol\u00e1sban. Ennek a val\u00f3di oka egy\u00e9bk\u00e9nt az, hogy a Math.random() 1-et sosem sorsolhat, \u00edgy a csonkol\u00e1s miatt a negat\u00edv sz\u00e1mokn\u00e1l gond lesz a legnagyobb (val\u00f3j\u00e1ban legkisebb) \u00e9rt\u00e9kkel. Ha valaki nem hiszi, sz\u00e1moljon ut\u00e1na.<\/p>\n<p>V\u00e9g\u00fcl \u00e1lljon itt p\u00e1r feladat adott intervallumb\u00f3l t\u00f6rt\u00e9n\u0151 sorsol\u00e1s gyakorl\u00e1s\u00e1hoz:<\/p>\n<p><strong>[-55;15]\u00a0 \u00a0[-40;5] \u00a0\u00a0[60;105]\u00a0\u00a0 [-50;35]\u00a0\u00a0 [45;95]\u00a0\u00a0 [50;50]\u00a0\u00a0 [10;25]\u00a0\u00a0 [20;105]\u00a0\u00a0 [80;95]<br \/>\n[-30;-25]\u00a0\u00a0 [40;60]\u00a0\u00a0 [-20;45]\u00a0\u00a0 [-10;15]\u00a0\u00a0 [-20;25]\u00a0\u00a0 [-45;-20]\u00a0\u00a0 [-25;75]\u00a0\u00a0 [-20;15]\u00a0\u00a0 [-15;95]<br \/>\n<\/strong><\/p>\n<h4>K\u00f6vetkez\u0151 lecke: <a title=\"Java programoz\u00e1s 12. \u2013 Ciklusok\" href=\"http:\/\/www.webotlet.hu\/?p=365\">Ciklusok<\/a><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>V\u00e9letlen sz\u00e1mok, avagy b\u00edzzuk a sorsra Programoz\u00e1s sor\u00e1n sokszor el\u0151fordul, hogy valamilyen \u00e9rt\u00e9ket v\u00e9letlenszer\u0171en kell megadni, vagy fel kell t\u00f6lteni egy t\u00f6mb\u00f6t v\u00e9letlen sz\u00e1mokkal. A v\u00e9letlen sz\u00e1m gener\u00e1l\u00e1s\u00e1nak m\u00f3dszere a k\u00f6vetkez\u0151: El\u0151sz\u00f6r meg kell hat\u00e1rozni annak az intervallumnak a hat\u00e1rait, <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=178\">Tov\u00e1bb <span class=\"screen-reader-text\">  Java programoz\u00e1s 11. &#8211; V\u00e9letlen sz\u00e1mok<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[99],"tags":[85,144,143,83,84],"class_list":["post-178","post","type-post","status-publish","format-standard","hentry","category-java-alap-leckek","tag-intervallum","tag-java_programozas","tag-programozas","tag-random","tag-veletlen"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=178"}],"version-history":[{"count":40,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions"}],"predecessor-version":[{"id":2851,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions\/2851"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}