Mam dość dziwny problem. Mam tablicę która zawiera wartości 's' i 'p' dla poszczególnych id (struktura poniżej).
Chcę wyrzucić konkretną ilość wartości $s i konkretną $p. Ale chciałem to zrobić losowo.
Napisałem więc funkcję (bo chyba nic takiego gotowego w php nie ma?), która idzie po kolejnych wartościach i sprawdza czy liczba $p którą chcę usunąć jest mniejsza od tej w tablicy. Jeśli tak to losuje liczbę i wyciągam resztę z dzielenia tej losowej przez $p+1, ale jeśli jest większa to to z dzielenia przez tą w tablicy+1.
I tak w kółko po wszystkich elementach tablicy aż $p i $s nie będą wynosić zero.
No i tu pojawia się problem, bo po pierwszym wykonaniu while reszta z dzielenia zawsze wynosi zero, a nie wierzę żeby wartość kilkuset losowych liczb%2 wynosiła zawsze zero. Więc pewnie mam jakiś błąd, ale nie mogę się go dopatrzyć.
Po zmianie funkcji rand() na mt_rand() i dodaniu jej parametrów zaczęło działać tak jak ma, więc nie wiem czy tu problem jakiś nie leży w rand(). (jej też próbowałem dawać takie parametry zamiast reszty z dzielenia, ale nadal się wysypywało...)
Ktoś ma pomysł co jest nie tak, bo zastanawiam się czy moja wiedza logiczna czy matematyczna tu zawaliła ;-)
kod:
  1. <?php
  2. //struktura tablicy
  3. $zrm = array(
  4. (
  5. 'p' => 2,
  6. 's' => 2
  7. ),
  8. (
  9. 'p' => 1,
  10. 's' => 2
  11. ),
  12. (
  13. 'p' => 1,
  14. 's' => 2
  15. ),
  16. (
  17. 'p' => 1,
  18. 's' => 0
  19. ),
  20. (
  21. 'p' => 1,
  22. 's' => 0
  23. ),
  24. (
  25. 'p' => 1,
  26. 's' => 0
  27. ),
  28. (
  29. 'p' => 1,
  30. 's' => 0
  31. ),
  32. (
  33. 'p' => 1,
  34. 's' => 1
  35. ),
  36. (
  37. 'p' => 0,
  38. 's' => 1
  39. ),
  40. (
  41. 'p' => 0,
  42. 's' => 1
  43. ),
  44. (
  45. 'p' => 1,
  46. 's' => 1
  47. ),
  48. (
  49. 'p' => 0,
  50. 's' => 1
  51. )
  52. );
  53.  
  54. //tutaj zaczyna się kod odpowiedzialny za losowanie
  55. $p = 7;
  56. $s = 8;
  57. while ($p >|| $s >0)
  58. {
  59. foreach($zrm as $id_zrm => &$values)
  60. {
  61. //echo"<li> $id_zrm => 'p' = $values[p] 's' = $values[s]";
  62. if($p<$values['p']) 
  63. {
  64. $val = rand()%($p+1);//mt_rand(0,$p);
  65. $values['p'] -= $val;
  66.  
  67. }
  68. else 
  69. {
  70. $val = rand()%($values['p']+1);//mt_rand(0, $values['p']);
  71.  
  72.  
  73. $values['p'] -= $val;
  74.  
  75. }
  76. $p -= $val;
  77.  
  78. if($s<$values['s']) 
  79. {
  80. $val = rand()%($s+1);
  81. $values['s'] -= $val;
  82. }
  83. else 
  84. {
  85. $val = rand()%($values['s']+1);
  86. $values['s'] -= $val;
  87. }
  88. $s -= $val;
  89. }
  90. echo "<li>POZOSTAło: $p p i $s s";
  91. }
  92. ?>