Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Losowe liczby bez powtarzania się
Forum PHP.pl > Forum > Przedszkole
sirkus
Witam

mam problem z pomysłem jak rozwiązać problem dotyczący nie powtarzania się liczb przy losowaniu 100 kombinacji po 5,6liczb każda

poniżej obrazek dla zoobrazowania problemu


czy da radę to zrobić bez bazy danych ?
z góry dziękuje za wszelkie pomysły
fate
Wg mnie musiałbys wymyslec wlasna funkcje pseudolosujaca (algorytm matematyczny)
Jak nie baza to plik musisz gdzies zapisywac co jest i porownywac jezeli istnieje to losowac kolejna
mmmmmmm
Wstawiasz sobie dane elementy do tablicy (nie tabeli bazodanowej, tylko statycznej tablicy). Lsujesz sobie z tej tablicy dany element. Po wylosowaniu usuwasz go z tej tablicy. Losujesz kolejny itd...
sirkus
Cytat(mmmmmmm @ 27.08.2013, 15:57:22 ) *
Wstawiasz sobie dane elementy do tablicy (nie tabeli bazodanowej, tylko statycznej tablicy). Lsujesz sobie z tej tablicy dany element. Po wylosowaniu usuwasz go z tej tablicy. Losujesz kolejny itd...

hmm to rozwiązanie chyba mi nie za bardzo pomoże bo np wylosowało mi zestaw liczb w którym jest 10
1, 5, 10, 22, 44
i jakbym 10 wywalił z tablicy to już ona nigdzie więcej nie wystąpi a może wystapić np w kolejnej kombinacji
3, 10, 11, 15, 48

lecz liczba 10 nie może wystąpić w kolejnej kombinacji w parze z jakąś liczbą z którą już w danej kombinacji była wylosowana (obrazek z 1 postu obrazuje to najlepiej bo nie bardzo wiem jak to porządnie opisać)

ogólnie to własnie chciałem to jakoś rozwiązać za pomocą tablicy a nie tabeli w bazie ale nie bardzo wiem jak
fate
Chodzi Ci o to że liczby wylosowane w 1 kombinacji nie powinny wystepowac razem w innej, pod warunkiem że wystąpią samodzielnie - czyli z innymi liczbami z którymi jeszcze nie były wspolnie "wylosowane" ?

Czesto poprawne sformulowanie problemu jest już prawie rozwiązaniem nerdsmiley.png
sirkus
Cytat(fate @ 27.08.2013, 16:15:41 ) *
Chodzi Ci o to że liczby wylosowane w 1 kombinacji nie powinny wystepowac razem w innej, pod warunkiem że wystąpią samodzielnie - czyli z innymi liczbami z którymi jeszcze nie były wspolnie "wylosowane" ?

Czesto poprawne sformulowanie problemu jest już prawie rozwiązaniem nerdsmiley.png

hmm coś takiego, z tym że powiem szczerze że czytałem to co napisałem 5 razy i do końca pewien nie jestem wink.gif

a więc napiszę jeszcze tak
losuję 25 kombinacji 5 lub 6 liczb z zakresu np od 1-50
i chodzi tylko o to aby wśród tych 25 wylosowanych kombinacji nigdzie nie znalazły się 2 takie same pary liczb
Wazniak96
Tworzysz tablicę dwuwymiarową, zawierającą wyniki losowania 6 cyfr. potem losujesz kolejny zestaw i sprawdzasz za pomocą array_map i array_diff czy nie mamy już czasem takiego zestawu.

Jak na razie jedyne co mi tak na szybkiego wpadło do głowy.
sirkus
Cytat(Wazniak96 @ 27.08.2013, 16:49:05 ) *
Jak na razie jedyne co mi tak na szybkiego wpadło do głowy.

dzięki, jestem poczatkującym amatorem jesli chodzi o php i wsumie wcześniej nie spotkałem się array_map i array_diff ale pokombinuje

jakby jeszcze komyś jakiś pomysł wpadł to bardzo proszę o pomoc
fate
Kolega wyczerpał mysle temat moze jeszcze bedzie potrzebne
count

Jak bedziesz mial problem rzuc skrwkiem kodu, powodzenia.
sirkus
Hej, uporządkowałem kod, trochę inaczej go przepisałem i już nie jest źle ale jeszcze do sukcesu trochę brakuje

obecnie losuje mi liczby nie powtarzając żadnej wogóle dopóki nie wykorzysta wszystkich dostępnych liczb czyli max 10 kombinacji po 5 liczb
a potrzebuje więcej kombinacji a nie powtarzać mają się tylko paru liczb, może ktoś zerknie co jest zwalone bo szukam błędu 2 dzień i nic

  1. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="pl-pl" xml:lang="pl-pl">
  2. <head>
  3. <title>Losowanie liczb </title>
  4. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  5. </head>
  6. <body>
  7.  
  8. <STYLE type="text/css">
  9.  
  10. form {
  11. font:11px Verdana, Sans-serif;
  12. margin:0 0 20px 10px;
  13. color:#646464;
  14. text-align:justify;
  15. line-height:17px;
  16. }
  17. input, select, textarea {
  18. border:1px solid #b3b3b3;
  19. padding:4px;
  20. background-color:#fafafa;
  21. -webkit-border-radius: 4px; /* Safari, Chrome */
  22. -khtml-border-radius: 4px; /* Konqueror */
  23. -moz-border-radius: 4px; /* Firefox */
  24. border-radius: 4px;
  25. }
  26.  
  27. #programik { width:600px; margin:0 auto;}
  28. table.funkcje td { width:50%; }
  29.  
  30. table.wynik td { width:100px; text-align:center; border:1px solid #b3b3b3; }
  31. </STYLE>
  32. </head>
  33. <body>
  34.  
  35.  
  36. <div id="programik">
  37. <table class="funkcje">
  38. <FORM action="test.php" method="post">
  39. <tr>
  40. <td>
  41. <LABEL for="kombinacja">Rodzaj kombinacji (np. ABBDE): </LABEL>
  42. </td>
  43. <td>
  44. <INPUT type="text" name="kombinacja" value="<? echo $_POST['kombinacja']; ?>">
  45. </td>
  46. </tr>
  47. <tr>
  48. <td>
  49. <LABEL for="ilosc_k">Ilość wylosowanych zestawów liczb: </LABEL>
  50. </td>
  51. <td>
  52. <INPUT type="text" name="ilosc_k" value="<? echo $_POST['ilosc_k']; ?>">
  53. </td>
  54. </tr>
  55. <tr>
  56. <td>
  57. <LABEL for="do_wykluczenia">Liczby nie biorące udziału w losowaniu: </LABEL>
  58. </td>
  59. <td>
  60. <INPUT type="text" name="do_wykluczenia" value="<? echo $_POST['do_wykluczenia']; ?>">
  61. </td>
  62. </tr>
  63. <tr>
  64. <td>
  65. <INPUT type="radio" name="powtorzenia" value="Male"> bez powtórzeń<BR>
  66. </td>
  67. <td>
  68. <INPUT type="radio" name="powtorzenia" value="Female"> możliwe powtórzenia liczb<BR>
  69. </td>
  70. </tr>
  71. <tr>
  72. <td>
  73. <INPUT type="radio" name="ilosc_liczb" value="4">5 liczb<BR>
  74. </td>
  75. <td>
  76. <INPUT type="radio" name="ilosc_liczb" value="5">6 liczb<BR>
  77. </td>
  78. </tr>
  79. <tr>
  80. <td>
  81. </td>
  82. <td>
  83. <INPUT type="submit" value="Wylosuj liczby">
  84. </td>
  85. </tr>
  86. </FORM>
  87. </table>
  88.  
  89.  
  90. <?php
  91. $komb=$_POST['kombinacja'];
  92.  
  93.  
  94. if(isset($_POST['ilosc_k']))
  95. {
  96. echo '<table class="wynik">';
  97. for ($i = 1; $i <= $_POST['ilosc_k']; $i++) {
  98.  
  99. echo '<tr>';
  100. for ($j = 0; $j <= $_POST['ilosc_liczb']; $j++) {
  101.  
  102. switch ($komb[$j]) {
  103. case 'A':
  104. wylosuj_liczby_bez_powtorzen(1,10);
  105. //$drukuj=rand (1, 10);
  106. break;
  107. case 'B':
  108. wylosuj_liczby_bez_powtorzen(11,20);
  109. //$drukuj=rand (11, 20);
  110. break;
  111. case 'C':
  112. wylosuj_liczby_bez_powtorzen(21,30);
  113. //$drukuj=rand (21, 30);
  114. break;
  115. case 'D':
  116. wylosuj_liczby_bez_powtorzen(31,40);
  117. //$drukuj=rand (31, 40);
  118. break;
  119. case 'E':
  120. wylosuj_liczby_bez_powtorzen(41,49);
  121. //$drukuj=rand (41, 49);
  122. break;
  123. }
  124. //echo $drukuj.' ';
  125. }
  126.  
  127. $dodajemy = explode(",", substr($tymczasowa,0,-1));
  128. foreach($dodajemy as $element)
  129. {
  130. //echo $element.”<br/>”;
  131. $wykluczone[$element.'a'][]=$dodajemy[0];
  132. $wykluczone[$element.'a'][]=$dodajemy[1];
  133. $wykluczone[$element.'a'][]=$dodajemy[2];
  134. $wykluczone[$element.'a'][]=$dodajemy[3];
  135. $wykluczone[$element.'a'][]=$dodajemy[4];
  136. }
  137.  
  138.  
  139. echo $tymczasowa.'<br />';
  140. unset($tymczasowa);
  141.  
  142.  
  143.  
  144. echo '</tr>';
  145. //unset($wykluczone);
  146.  
  147.  
  148. }
  149. echo '</table>';
  150.  
  151. }
  152.  
  153.  
  154. //$wykluczone[$element.'a'][]=125;
  155.  
  156.  
  157. function wylosuj_liczby_bez_powtorzen($najmniejsza,$najwieksza) {
  158. global $wykluczone;
  159. global $tymczasowa;
  160.  
  161.  
  162. if(!isset($wykluczone))
  163. {
  164. $wykluczone=array();
  165. }
  166.  
  167. $losowa=rand($najmniejsza,$najwieksza);
  168.  
  169. if(!isset($wykluczone[$losowa.'a']))
  170. {
  171. $wykluczone[$losowa.'a']=array();
  172. }
  173.  
  174.  
  175. if (in_array($losowa, $wykluczone[$losowa.'a']))
  176. {
  177. return wylosuj_liczby_bez_powtorzen($najmniejsza,$najwieksza);
  178. }
  179. else
  180. {
  181. $wykluczone[$losowa.'a'][]=$losowa;
  182. print("<td> $losowa </td>");
  183. $tymczasowa=$tymczasowa.$losowa.',';
  184. }
  185.  
  186.  
  187.  
  188.  
  189.  
  190. }
  191.  
  192.  
  193. ?>
  194.  
  195.  
  196. <?php
  197. echo '<pre>';
  198. print_r($wykluczone);
  199. echo '</pre>';
  200. ?>
  201.  
  202. </body>
  203. </html>
  204.  
  205.  
gitbejbe
  1. <?php
  2. function random_numbers ($from, $to, $amount) {
  3. $range = range($from, $to);
  4. $random = array_rand($range, $amount);
  5. $result = array();
  6. if (is_array($random)) {
  7. foreach ($random as $index) {
  8. $result []= $range[$index];
  9. }
  10. } else {
  11. $result []= $range[$random];
  12. }
  13. return $result;
  14. }
  15. random_numbers(1, 100, 10);
  16. ?>

pozdrawiam
sirkus
dzięki niestety tą funkcją nie bardzo mi pomogłeś ponieważ mój problem tkwi gdzie indziej
nie mogę losować poprostu przypadkowych liczb bo w formularzy wpisuje litery AAABB lub ABCDE i każda literka odpowiada zakresowy kolejnych liczb A-1..10 B-11...20 C-21-30 itd

i najważniejszą rzeczą jest aby przy np 100losowaniach po 5 liczb nie powtarzały się te same pary liczb

tzn jak w losowaniu np. 11 padło 10,15,25,33,48 to w losowaniu 54 nie może wystąpić np. 10,15 lub 25 z 48 ale spokojnie może wystąpić np 10 z 17 lub 25 z 49

i właśnie z tym się pierdziele już tydzień
fate
Potrzebujesz funkcji ktora z wyniku pojedynczego losowania (5 liczb) zrobi ci tablice (lub plik) wszystkich kombinacji par dwuliczbowych, bez matematyki się nie obejdzie a ten dział zupełnie mi nie leżał.
Po kazdym losowaniu tworzysz taka tablice.
Przed kazdym losowaniem sprawdzasz wszystkie stworzone tablice.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.