Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Losowanie 3 licz z przedziału wiele razy
programistaarek
post 20.03.2020, 13:51:57
Post #1





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 1.02.2015

Ostrzeżenie: (0%)
-----


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 = array();
  3. for($i=30;$i<=39;$i++)
  4. {
  5. $tab[] = $i;
  6. }
  7.  
  8. $lotto = array_rand ($tab, 3);
  9. echo $tab[$lotto[0]] . "\n";
  10. echo $tab[$lotto[1]] . "\n";
  11. echo $tab[$lotto[2]] . "\n";
  12.  
  13.  
  14. ?>

Pozdrawiam i czekam na odpowiedzi.


--------------------
Go to the top of the page
+Quote Post
kreatiff
post 20.03.2020, 16:54:32
Post #2





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


Można np. tak:
  1. $tab = range(30,39);
  2. $liczebnoscZbioru = 3;
  3. $liczbaLosowan = 30; // ile chcesz mieć zestawów liczb
  4.  
  5. if ($liczebnoscZbioru > count($tab)) die('Zmniejsz liczebność pojedynczego zbioru.');
  6. $wynik = [];
  7. $powtorzenie = 0;
  8. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  9. shuffle($tab);
  10. $los = array_slice($tab, 0, $liczebnoscZbioru);
  11. sort($los);
  12. if (in_array($los, $wynik)) {
  13. $i--;
  14. $powtorzenie++;
  15. if ($powtorzenie > 100) { // zabezpieczenie przed nieskończoną pętlą
  16. 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.
Go to the top of the page
+Quote Post
programistaarek
post 20.03.2020, 18:59:43
Post #3





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 1.02.2015

Ostrzeżenie: (0%)
-----


Cytat(kreatiff @ 20.03.2020, 16:54:32 ) *
Można np. tak:
  1. $tab = range(30,39);
  2. $liczebnoscZbioru = 3;
  3. $liczbaLosowan = 30; // ile chcesz mieć zestawów liczb
  4.  
  5. if ($liczebnoscZbioru > count($tab)) die('Zmniejsz liczebność pojedynczego zbioru.');
  6. $wynik = [];
  7. $powtorzenie = 0;
  8. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  9. shuffle($tab);
  10. $los = array_slice($tab, 0, $liczebnoscZbioru);
  11. sort($los);
  12. if (in_array($los, $wynik)) {
  13. $i--;
  14. $powtorzenie++;
  15. if ($powtorzenie > 100) { // zabezpieczenie przed nieskończoną pętlą
  16. 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

Ten post edytował programistaarek 20.03.2020, 19:01:43


--------------------
Go to the top of the page
+Quote Post
kreatiff
post 20.03.2020, 20:53:29
Post #4





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
programistaarek
post 21.03.2020, 15:18:36
Post #5





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 1.02.2015

Ostrzeżenie: (0%)
-----


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 :/


--------------------
Go to the top of the page
+Quote Post
viking
post 21.03.2020, 16:11:45
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
programistaarek
post 21.03.2020, 17:27:00
Post #7





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 1.02.2015

Ostrzeżenie: (0%)
-----


  1. <title>Losowanie LOTTO</title>
  2. <?php
  3.  
  4. $tab = range(30,39);
  5. $liczebnoscZbioru = 3;
  6. $liczbaLosowan = 300; // ile chcesz mieć zestawów liczb
  7.  
  8. if ($liczebnoscZbioru > count($tab)) die('Zmniejsz liczebność pojedynczego zbioru.');
  9. $wynik = [];
  10. $powtorzenie = 0;
  11. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  12. shuffle($tab);
  13. $los = array_slice($tab, 0, $liczebnoscZbioru);
  14. sort($los);
  15. if (in_array($los, $wynik)) {
  16. $i--;
  17. $powtorzenie++;
  18. if ($powtorzenie > 300) { // zabezpieczenie przed nieskończoną pętlą
  19. 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. echo "<br>";
  31. }
  32. echo ''.$los.'&nbsp;';
  33. if ($count%3 == 0)
  34. {
  35. echo "<br>";
  36. }
  37. $count++;
  38. }
  39. if ($count%3 != 1) 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 ?


--------------------
Go to the top of the page
+Quote Post
kreatiff
post 21.03.2020, 22:27:41
Post #8





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


Daj jeszcze:
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.

Ten post edytował kreatiff 21.03.2020, 22:31:07
Go to the top of the page
+Quote Post
programistaarek
post 22.03.2020, 15:11:53
Post #9





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 1.02.2015

Ostrzeżenie: (0%)
-----


  1. <title>Losowanie LOTTO</title>
  2. <?php
  3.  
  4. $tab = range(30,39);
  5. $liczebnoscZbioru = 3;
  6. $liczbaLosowan = 300; // ile chcesz mieć zestawów liczb
  7.  
  8. if ($liczebnoscZbioru > count($tab)) die('Zmniejsz liczebność pojedynczego zbioru.');
  9.  
  10. $wynik = [];
  11. $powtorzenie = 0;
  12.  
  13. for ($i = 1; $i <= $liczbaLosowan; $i++) {
  14. shuffle($tab);
  15. $los = array_slice($tab, 0, $liczebnoscZbioru);
  16. sort($los);
  17. if (in_array($los, $wynik)) {
  18. $i--;
  19. $powtorzenie++;
  20. if ($powtorzenie > 300) { // zabezpieczenie przed nieskończoną pętlą
  21. 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. array_multisort($wynik);
  32. if ($count%3 == 1)
  33. {
  34. echo "<br>";
  35. }
  36. echo ''.$los.'&nbsp;';
  37. if ($count%3 == 0)
  38. {
  39. echo "<br>";
  40. }
  41. $count++;
  42. }
  43. if ($count%3 != 1) 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 :/


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 08:26