Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP]Losowanie 3 licz z przedziału wiele razy

Napisany przez: programistaarek 20.03.2020, 13:51:57

Witam chciałbym napisać kod w PHP który z przedziału liczb 30-39 wylosuje mi liczby bez powtórzeń 3 liczby w takiej formie
np 32 35 39
Ale chcę by wylosowało mi maksymalną kombinację takich liczb np
- 30 31 32
- 31 32 33
- 30 31 33
Wiadomo bez powtórzeń
itd itd
Jak takie coś napisać żeby losowało wszystkie kombinacje na raz a nie tylko jeden rekord oraz jak dać ograniczenie np do wylosowania bez powtórzeń hmm 10 rekordów
Obecnie mam taki kod i działa dobrze po losuje 3 liczby bez powtórzeń ale tylko jedna linijka a chcę by pokazało maksymalną możliwość razy

  1. <?php
  2. $tab = http://www.php.net/array();
  3. for($i=30;$i<=39;$i++)
  4. {
  5. $tab[] = $i;
  6. }
  7.  
  8. $lotto = http://www.php.net/array_rand ($tab, 3);
  9. http://www.php.net/echo $tab[$lotto[0]] . "\n";
  10. http://www.php.net/echo $tab[$lotto[1]] . "\n";
  11. http://www.php.net/echo $tab[$lotto[2]] . "\n";
  12.  
  13.  
  14. ?>

Pozdrawiam i czekam na odpowiedzi.

Napisany przez: kreatiff 20.03.2020, 16:54:32

Można np. tak:

  1. $tab = http://www.php.net/range(30,39);
  2. $liczebnoscZbioru = 3;
  3. $liczbaLosowan = 30; // ile chcesz mieć zestawów liczb
  4.  
  5. if ($liczebnoscZbioru > http://www.php.net/count($tab)) http://www.php.net/die('Zmniejsz liczebność pojedynczego zbioru.');
  6. $wynik = [];
  7. $powtorzenie = 0;
  8. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  9. http://www.php.net/shuffle($tab);
  10. $los = http://www.php.net/array_slice($tab, 0, $liczebnoscZbioru);
  11. http://www.php.net/sort($los);
  12. if (http://www.php.net/in_array($los, $wynik)) {
  13. $i--;
  14. $powtorzenie++;
  15. if ($powtorzenie > 100) { // zabezpieczenie przed nieskończoną pętlą
  16. http://www.php.net/die('Brak liczby wymaganych wyników - zmniejsz liczbę losowań lub zwiększ przedział liczbowy.');
  17. }
  18. } else {
  19. $wynik[$i] = $los;
  20. }
  21. }
W $wynik masz $liczbaLosowan unikalnych tablic z $liczebnoscZbioru wylosowanymi z zadanego przedziału liczbami.

Napisany przez: programistaarek 20.03.2020, 18:59:43

Cytat(kreatiff @ 20.03.2020, 16:54:32 ) *
Można np. tak:
  1. $tab = http://www.php.net/range(30,39);
  2. $liczebnoscZbioru = 3;
  3. $liczbaLosowan = 30; // ile chcesz mieć zestawów liczb
  4.  
  5. if ($liczebnoscZbioru > http://www.php.net/count($tab)) http://www.php.net/die('Zmniejsz liczebność pojedynczego zbioru.');
  6. $wynik = [];
  7. $powtorzenie = 0;
  8. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  9. http://www.php.net/shuffle($tab);
  10. $los = http://www.php.net/array_slice($tab, 0, $liczebnoscZbioru);
  11. http://www.php.net/sort($los);
  12. if (http://www.php.net/in_array($los, $wynik)) {
  13. $i--;
  14. $powtorzenie++;
  15. if ($powtorzenie > 100) { // zabezpieczenie przed nieskończoną pętlą
  16. http://www.php.net/die('Brak liczby wymaganych wyników - zmniejsz liczbę losowań lub zwiększ przedział liczbowy.');
  17. }
  18. } else {
  19. $wynik[$i] = $los;
  20. }
  21. }
W $wynik masz $liczbaLosowan unikalnych tablic z $liczebnoscZbioru wylosowanymi z zadanego przedziału liczbami.


Nic się nie wyświetla :/
Dałem echo $wynik; i nic :/
Jedynie np 30 razy samo array

Napisany przez: kreatiff 20.03.2020, 20:53:29

Nic a Array to jest zasadnicza różnica.
Podglądu zawartości całej tablicy (array) nie wyświetla się pleceniem echo. Zrób sobie jakąś pętlę do wyświetlania tego wedle życzenia. Albo użyj print_r czy var_dump by podejrzeć co w tablicy $wynik się znajduje i jak jest uporządkowane.

Napisany przez: programistaarek 21.03.2020, 15:18:36

Cytat(kreatiff @ 20.03.2020, 20:53:29 ) *
Nic a Array to jest zasadnicza różnica.
Podglądu zawartości całej tablicy (array) nie wyświetla się pleceniem echo. Zrób sobie jakąś pętlę do wyświetlania tego wedle życzenia. Albo użyj print_r czy var_dump by podejrzeć co w tablicy $wynik się znajduje i jak jest uporządkowane.


Jak dam np aby się wykonało 30 razy to mam 30 razy Array :/

Napisany przez: viking 21.03.2020, 16:11:45

I każdy array zawiera n-elementów z liczebności zbioru. Przecież sam chciałeś taki wynik.

Napisany przez: programistaarek 21.03.2020, 17:27:00

  1. <title>Losowanie LOTTO</title>
  2. <?php
  3.  
  4. $tab = http://www.php.net/range(30,39);
  5. $liczebnoscZbioru = 3;
  6. $liczbaLosowan = 300; // ile chcesz mieć zestawów liczb
  7.  
  8. if ($liczebnoscZbioru > http://www.php.net/count($tab)) http://www.php.net/die('Zmniejsz liczebność pojedynczego zbioru.');
  9. $wynik = [];
  10. $powtorzenie = 0;
  11. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  12. http://www.php.net/shuffle($tab);
  13. $los = http://www.php.net/array_slice($tab, 0, $liczebnoscZbioru);
  14. http://www.php.net/sort($los);
  15. if (http://www.php.net/in_array($los, $wynik)) {
  16. $i--;
  17. $powtorzenie++;
  18. if ($powtorzenie > 300) { // zabezpieczenie przed nieskończoną pętlą
  19. http://www.php.net/die('Brak liczby wymaganych wyników - zmniejsz liczbę losowań lub zwiększ przedział liczbowy.');
  20.  
  21. }
  22. } else {
  23. $wynik[$i] = $los;
  24.  
  25. $count = 1;
  26. foreach( $wynik[$i] as $los )
  27. {
  28. if ($count%3 == 1)
  29. {
  30. http://www.php.net/echo "<br>";
  31. }
  32. http://www.php.net/echo ''.$los.'&nbsp;';
  33. if ($count%3 == 0)
  34. {
  35. http://www.php.net/echo "<br>";
  36. }
  37. $count++;
  38. }
  39. if ($count%3 != 1) http://www.php.net/echo "<br>";
  40.  
  41. }
  42. }
  43. ?>


Już ogarnięte Dzięki plus leci exclamation.gif smile.gif
a da się do tego kodu dopisać żeby mi wyświetlało po kolei liczby czy nie tzn
teraz mam np
31 33 39
34 37 38

no są ogólnie rozsypane a mi chodziło np żeby teraz dać takie coś

30 31 32
30 31 33
30 31 34
Ktoś jest w stanie podać rozwiązanie smile.gif ?

Napisany przez: kreatiff 21.03.2020, 22:27:41

Daj jeszcze:

  1. http://www.php.net/array_multisort($wynik);
tuż przed działaniem na tabilcy z wynikami.
Tylko musisz tę pętlę foreach dać za pętlą for generującą tablicę, a nie w niej.

Napisany przez: programistaarek 22.03.2020, 15:11:53

  1. <title>Losowanie LOTTO</title>
  2. <?php
  3.  
  4. $tab = http://www.php.net/range(30,39);
  5. $liczebnoscZbioru = 3;
  6. $liczbaLosowan = 300; // ile chcesz mieć zestawów liczb
  7.  
  8. if ($liczebnoscZbioru > http://www.php.net/count($tab)) http://www.php.net/die('Zmniejsz liczebność pojedynczego zbioru.');
  9.  
  10. $wynik = [];
  11. $powtorzenie = 0;
  12.  
  13. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  14. http://www.php.net/shuffle($tab);
  15. $los = http://www.php.net/array_slice($tab, 0, $liczebnoscZbioru);
  16. http://www.php.net/sort($los);
  17. if (http://www.php.net/in_array($los, $wynik)) {
  18. $i--;
  19. $powtorzenie++;
  20. if ($powtorzenie > 300) { // zabezpieczenie przed nieskończoną pętlą
  21. http://www.php.net/die('Brak liczby wymaganych wyników - zmniejsz liczbę losowań lub zwiększ przedział liczbowy.');
  22.  
  23. }
  24. } else {
  25. $wynik[$i] = $los;
  26.  
  27. $count = 1;
  28.  
  29. foreach( $wynik[$i] as $los )
  30. {
  31. http://www.php.net/array_multisort($wynik);
  32. if ($count%3 == 1)
  33. {
  34. http://www.php.net/echo "<br>";
  35. }
  36. http://www.php.net/echo ''.$los.'&nbsp;';
  37. if ($count%3 == 0)
  38. {
  39. http://www.php.net/echo "<br>";
  40. }
  41. $count++;
  42. }
  43. if ($count%3 != 1) http://www.php.net/echo "<br>";
  44.  
  45. }
  46. }
  47. ?>

Obecnie mam taki kod no efekt zamierzony jest także jeszcze raz Ci dziękuję za pomoc. Jeśli pętlę foreach dam poza pętlę for to mi wyświetla tylko i wyłącznie jeden wynik :/
Chyba, że wiesz jak to ogarnąć to mógłbyś podesłać gotowca :/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)