Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Losowanie bez powtórzeń - cd
Forum PHP.pl > Forum > Przedszkole
artur81
Witam, sam nie umiem rozwiązać tego problemu stąd to pytanie: w jaki sposob zrobić coś takiego aby pytania były losowane bez powtórzeń questionmark.gif Wczoraj już pisałem na ten temat , otrzymałem kilka propozycji ale wskutek powtarzających się problemów - poległem.
Skrypt operuje na 5 plikach (prosty system egzaminacyjny). Pojawiają się trzy opowiedzi do wyboru ( wylosowane z bazy danych), użytkownik zaznacza jedną z nich, po czym daje "Dalej" i na następnej stronie ponownie następuje losowanie pytań z bazy. Chodzi mi o to żeby kolejne losowania nie uwzględniały numerów pytań wylosowanych już wcześniej.
Plik1
  1. <?php
  2.  
  3. //Jeżeli nie ma ustanowionej sesji przekierowuję użytkownika do logowania
  4. if (!isset($_SESSION['uzytkownik'])) {
  5. //ob_end_clean();
  6. header (&#092;"Location: http://localhost/logowanie.php\");
  7.  
  8. exit ();
  9. } else {
  10.  
  11. require_once('./polacz_z_baza.php');
  12.  
  13.  
  14. $wynik = mysql_query (&#092;"SELECT * FROM pytania ORDER BY RAND() LIMIT 1;\");
  15.  
  16. print &#092;"<table cellpadding = 5 border = 0>\";
  17. //print \"<tr><td><b>Numer</b></td><td><b>Pytanie</b></td></tr>n\";
  18.  
  19.  while ($rekord = mysql_fetch_array ($wynik)) {
  20.  
  21. $nr = $rekord['nr'];
  22. $pyt = $rekord['pyt'];
  23. $odp1 = $rekord['odp1'];
  24. $odp2 = $rekord['odp2'];
  25. $odp3 = $rekord['odp3'];
  26. $odppop = $rekord['odppop'];
  27. $nrok = $rekord['nrok'];
  28.  
  29.  }
  30.  
  31.  
  32. print &#092;"<tr><td><h3>$pyt</b></h3></td></tr>\";  //<td><h3><b>$nr.</b></h3></td>
  33. print &#092;"</table>\";
  34.  
  35.  // LISTA ROZWIJANA
  36. /*przesylam formularzem wybrana przez uzytkownika odpowiedz i numer pytania na kt
  37. re odpowiadal
  38. oraz za pomocą zmiennej sesyjnej poprawną odpowiedź*/
  39. print '<form action=egzamin1.php method=post>';
  40. print &#092;"<input type = 'hidden' name='nr' value=$nr>\";
  41.  
  42. print ' <select name=\"opcja\" style=\"background-color: #C0E2C1;\">';
  43. print ' <option selected value =\"\">';
  44. print &#092;" <option>$odp1</option> \";
  45. print &#092;" <option>$odp2</option> \";
  46. print &#092;" <option>$odp3</option> \";
  47. print ' </select>';
  48. print '<br><br><br> ';
  49. print '<input type=\"submit\" value=\"Następne pytanie\" style=\"background-color: #C0E2C1;\">';
  50. print ' </form>';
  51.  }
  52. $_SESSION['odpowiedz_na_1'] = $odppop;
  53. $_SESSION['punkty']=0;
  54. $_SESSION['pytanie1']=$nr;
  55.  
  56.  //kto odpowiada??
  57. //$odpowiada=$_SESSION['uzytkownik'];
  58. //print \"Na pytania udziela odpowiedz $odpowiada\";
  59.  
  60. print '<body bgcolor = #CCFFCC>';
  61. //ob_end_flush();
  62. ?>


Plik2
  1. <?php
  2.  
  3. //Jeżeli nie ma ustanowionej sesji przekierowuję użytkownika do logowania
  4. if (!isset($_SESSION['uzytkownik'])) {
  5. header (&#092;"Location: http://localhost/logowanie.php\");
  6.  
  7. exit ();
  8. } else {
  9.  
  10. require_once('./polacz_z_baza.php');
  11.  
  12.  
  13. $wynik = mysql_query (&#092;"SELECT * FROM pytania ORDER BY RAND() LIMIT 1;\");
  14.  
  15. print &#092;"<table cellpadding = 5 border = 0>\";
  16. //print \"<tr><td><b>Numer</b></td><td><b>Pytanie</b></td></tr>n\";
  17.  
  18.  while ($rekord = mysql_fetch_array ($wynik)) {
  19.  
  20. $nr = $rekord['nr'];
  21. $pyt = $rekord['pyt'];
  22. $odp1 = $rekord['odp1'];
  23. $odp2 = $rekord['odp2'];
  24. $odp3 = $rekord['odp3'];
  25. $odppop = $rekord['odppop'];
  26. $nrok = $rekord['nrok'];
  27.  
  28.  
  29.  }
  30.  
  31.  
  32. print &#092;"<tr><td><h3>$pyt</b></h3></td></tr>\"; //<td><h3><b>$nr.</b></h3></td>
  33. print &#092;"</table>\";
  34.  
  35.  
  36. //CHECKBOXY
  37. //Formularz
  38.  
  39. print '<form action=egzamin2.php method=post>';
  40. print &#092;"<input type = 'hidden' name='nr' value=$nr>\";
  41. print &#092;"<input type = 'hidden' name='odppop' value='$odppop'>\";
  42.  
  43. print &#092;"<input type='checkbox' name='odp' value='$odp1'>$odp1\";
  44. print '<br>';
  45. print &#092;"<input type='checkbox' name='odp' value='$odp2'>$odp2\";
  46. print '<br>';
  47. print &#092;"<input type='checkbox' name='odp' value='$odp3'>$odp3\";
  48. print '<br>';
  49.  
  50. print '<br><br><br> ';
  51. print '<input type=\"submit\" value=\"Następne pytanie\" style=\"background-color: #C0E2C1;\">';
  52. print ' </form>';
  53.  
  54. $odp_na_1=$_SESSION['odpowiedz_na_1'];
  55. $_SESSION['odpowiedz_na_2'] = $odppop;
  56.  
  57. //odebranie i wyswietlenie odpowiedzi udzielonych na pierwsze pytanie w egzaminie
  58. $wybrano =$_POST['opcja'];
  59. $numer =$_POST['nr'];
  60. print '<br<<br><br>';
  61. print 'W poprzednim pytaniu udzieliłeś następujących odpowiedzi:<br>';
  62. print &#092;"Pytanie było oznaczone numerem <b>$numer</b>,<br>\";
  63. print &#092;"Ty wybrałeś/aś odpowiedź: <b>$wybrano</b>,<br>\";
  64. print &#092;"natomiast poprawną odpowiedzią było: <b>$odp_na_1</b><br>\";
  65.  
  66. $punkty =$_SESSION['punkty'];
  67. if ($odp_na_1 == $wybrano ) {
  68. $punkty= $punkty + 20;
  69. } else {
  70. $punkty = $punkty - 10;
  71. }
  72. $_SESSION['punkty']=$punkty;
  73. print '<br><br><br> ';
  74. print &#092;"Na razie zgromadziłeś <b>$punkty punktów</b>\";
  75. /* kto odpowiada??
  76. $odpowiada=$_SESSION['uzytkownik'];
  77. print \"Na pytania udziela odpowiedz $odpowiada\"; */ }
  78. $_SESSION['pytanie2']=$nr;
  79.  
  80. print '<body bgcolor = #CCFFCC>';
  81. ?>
Kshyhoo
Hi, kiedy na którymś z for skopiowałem taki kod, może się Ci przyda:
  1. <?php
  2. srand ((float) microtime() * 10000000);
  3.  
  4. $licz = global_losuj();
  5.  
  6. for($i = 0; $i < 10; $i++){
  7.  
  8. print &#092;"wylosowal $licz[$i]<br>\";
  9. }
  10.  
  11. //}
  12. // tutaj konczy sie toporny engine. mozna to wykasowac i zapodac jeno includy do t
  13. go skryptu z wywolaniem funkcji global_losuj()
  14.  
  15. // funkcja ktora odpowiada za dobor liczb przy losowaniu
  16.  
  17. function global_losuj(){
  18.  
  19. $parzyste = rand(4,7);
  20. $nie_parzyste = 10 - $parzyste;
  21.  
  22. //to ponizej jeno dla pokazania jaki stosunek jezd liczb. normalnie wyciac i jush 
  23. ic nie bedzie sie wyswietlalo
  24. print &#092;"parzyste : nieparzyste -> $parzyste : $nie_parzyste<br><br>\";
  25.  
  26. do{
  27.  
  28. $i = 1;
  29. $ilosc_nie_parzyste = 0;
  30. $ilosc_parzyste = 0;
  31. $anty_crash = 0;
  32. $jeszczeraz = 0;
  33.  
  34. while($i != 11){
  35.  
  36. $uk = losuj();
  37. $powtorka = 0;
  38. // sprawdzanie czy liczba jush nie wystapila
  39. $q = 0;
  40. while ($q != $i){
  41.  
  42. if($liczby_tablica[$q] == $uk){
  43.  
  44. $powtorka = 1;
  45.  
  46. }
  47. $q++;
  48. }
  49.  
  50. // tera sprawdzanie koncowek
  51. if($powtorka == 0){
  52. $ukkk = $uk%10;
  53.  
  54. if($reszta[$ukkk] == 2){
  55.  
  56. $powtorka = 1;
  57. }
  58.  
  59. if($reszta[$ukkk] == 1){
  60.  
  61. $reszta[$ukkk]++;
  62. }
  63.  
  64. if($reszta[$ukkk] == &#092;"\"){
  65.  
  66. $reszta[$ukkk] = 1;
  67. }
  68.  
  69. }
  70.  
  71. // tera zapodanie stosunku tongue.gif
  72. if($powtorka == 0){
  73. if(($uk%2) == 0){
  74.  
  75. if($ilosc_parzyste >= $parzyste){
  76. $powtorka = 1;
  77. }
  78. if($ilosc_parzyste < $parzyste){
  79. $ilosc_parzyste++;
  80. }
  81. }
  82.  
  83. if(($uk%2) != 0){
  84.  
  85. if($ilosc_nie_parzyste >= $nie_parzyste){
  86. $powtorka = 1;
  87. }
  88. if($ilosc_nie_parzyste < $nie_parzyste){
  89. $ilosc_nie_parzyste++;
  90. }
  91. }
  92.  
  93. }
  94.  
  95. // sprawdzenie czy nie ma trojek mozliwych
  96. $q = 0;
  97. while ($q != $i){
  98.  
  99. if(($liczby_tablica[$q]+== $uk)&&($liczby_tablica[$q+1]-== $uk)){
  100.  
  101. $powtorka = 1;
  102.  
  103. }
  104.  
  105. if(($liczby_tablica[$q-1]+== $uk)&&($liczby_tablica[$q]+== $uk)){
  106.  
  107. $powtorka = 1;
  108.  
  109. }
  110.  
  111. if(($liczby_tablica[$q+1]-== $uk)&&($liczby_tablica[$q]-== $uk)){
  112.  
  113. $powtorka = 1;
  114.  
  115. }
  116.  
  117. $q++;
  118. }
  119.  
  120.  
  121. // tera sprawdzanie dziesiatek
  122.  
  123. if ($powtorka == 0){
  124. if($uk > 10){
  125. $temp = $uk/10;
  126.  
  127. preg_match(&#092;"/(d+)(.?d?)/\",$temp, $wynik);
  128.  
  129. $temp2 = $wynik[1];
  130. if($dziesiatki[$temp2] < 3){
  131. $dziesiatki[$temp2]++;
  132. }
  133. else{
  134. $powtorka = 1;
  135. }
  136. }
  137. else{
  138. if($dziesiatki[0] < 3){
  139. $dziesiatki[0]++;
  140. }
  141. else{
  142. $powtorka = 1;
  143. }
  144. }
  145.  
  146.  
  147. }
  148.  
  149. //tera progres albo i nie do nastepnej liczby tongue.gif
  150.  
  151. $anty_crash++;
  152. if ($powtorka == 0){
  153. $liczby_tablica[$i] = $uk;
  154.  
  155. $i++;
  156. sort($liczby_tablica);
  157.  
  158. }
  159.  
  160. // jak za dlugo generuje to trza wystartowac od poczatku bo inaczej do konca swiat
  161.  sie nie wyrobi :P
  162. if($anty_crash > 100){
  163.  
  164. $i = 11;
  165. $jeszczeraz = 1;
  166.  
  167. unset($liczby_tablica);
  168. unset($dziesiatki);
  169. unset($reszta);
  170.  
  171.  
  172. }
  173. }
  174.  
  175.  
  176. }while($jeszczeraz != 0);
  177.  
  178.  
  179.  
  180. return $liczby_tablica;
  181. }
  182.  
  183. //funkcja ktora strice losuje. jak trza zmienic przedzialy albo cos to tu grzebac
  184.  
  185. function losuj(){
  186.  
  187. $koniec_losowania = 0;
  188.  
  189. do{
  190. $liczba = rand(20,69);
  191. if((($liczba <= 39)&&($liczba >= 20))||(($liczba <= 69)&&($liczba >= 50))){
  192.  
  193. $koniec_losowania = 1;
  194.  
  195. }
  196. }while($koniec_losowania != 1);
  197. return $liczba;
  198.  
  199. }
  200.  
  201. ?>
artur81
niby wszystko ok, tylko ze tutaj funkcja losująca losuje liczby z podanych przedziałów a ja po pierwsze raczej nie będę miał kontroli nad przedziałem poza tym na polu ktore chce filtrowac jest autoincrement wiec czesc numerkow jest np takich 1,2,3,4,5 a dalej są 37,43, 48 gdyż były przeprowadzana na bazie operacje kasowania rekordów
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.