Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Problem z losowaniem par liczb
Forum PHP.pl > Forum > Przedszkole
PiNkOs
Witam,

Mam mapę 700x700 (coś podobnego jak mapa w grach przeglądarkowych). Pragnę wypełnić 10% mapy specjalnymi polami, które będą na stałe zapisane w bazie. Pola są całkowicie niezależne i losowe.

Wyliczyłem, że potrzebuję 49 000 takich pół. Pole składa się ze współrzędnych x i y. Para liczb od 1-700 powinna być niepowtarzalna.

Zabrałem sie do pracy i przygotowałem sobie taki plik:

  1. <?
  2. //db conn//
  3. for($i=0;$i<=1000;$i++){
  4. $los_x = rand(1, 700);
  5. $los_y = rand(1, 700);
  6. $check = mysql_num_rows(mysql_query("SELECT id FROM map WHERE x=".$los_x." AND y=".$los_y));
  7. if($check == 0){
  8. $query = mysql_query("INSERT INTO map(x, y, type) VALUES(".$los_x.", ".$los_y.", 1)");
  9. if($query){
  10. echo $i.'<br />';
  11. }else{
  12. }
  13. }else{
  14. echo $i.' '.$check.' exist '.$los_x.'|'.$los_y.'<br />';
  15. }
  16. unset($los_x);
  17. unset($los_y);
  18. }
  19. ?>


Do jakiegoś czasu wszystko szło dobrze. W bazie danych umieściłem ~ 24 000 pól, jednak potem wszystko się popsuło, gdyż zmienna $check dla każdego obiegu pętli zaczęła zwracać 1 (questionmark.gifquestionmark.gif).

W konsekwencji wygląda to tak:
Kod
0 1 exist 591|311
1 1 exist 84|166
2 1 exist 436|94
3 1 exist 573|563
4 1 exist 362|269
5 1 exist 433|160
6 1 exist 609|464
7 1 exist 428|511
8 1 exist 368|658
9 1 exist 273|18
10 1 exist 579|479
11 1 exist 36|234
12 1 exist 434|605
13 1 exist 130|264
14 1 exist 172|663
15 1 exist 623|259
16 1 exist 385|633
17 1 exist 529|23
18 1 exist 613|142
19 1 exist 614|409
20 1 exist 47|569
21 1 exist 593|520
22 1 exist 326|141
23 1 exist 534|510
24 1 exist 643|236
25 1 exist 150|181
26 1 exist 538|484
27 1 exist 207|387
28 1 exist 600|161
29 1 exist 422|230
30 1 exist 371|296
31 1 exist 160|564
32 1 exist 442|168
33 1 exist 536|492
34 1 exist 353|103
35 1 exist 217|168
36 1 exist 694|81
37 1 exist 317|93
38 1 exist 307|430
39 1 exist 202|422
40 1 exist 481|427
41 1 exist 288|257
42 1 exist 58|401
43 1 exist 641|452
44 1 exist 329|330
45 1 exist 277|109
46 1 exist 133|542
47 1 exist 660|82
48 1 exist 61|315
49 1 exist 106|175
50 1 exist 355|677
51 1 exist 82|539
52 1 exist 204|206
53 1 exist 302|278
54 1 exist 549|632
55 1 exist 133|246
56 1 exist 582|530
57 1 exist 690|245
58 1 exist 542|231
59 1 exist 638|429
60 1 exist 320|411
61 1 exist 394|601
62 1 exist 157|700
63 1 exist 22|213
64 1 exist 643|374
65 1 exist 639|469
66 1 exist 619|463
67 1 exist 210|123
68 1 exist 676|244
69 1 exist 550|376
70 1 exist 355|46
71 1 exist 326|683
72 1 exist 245|546
73 1 exist 653|146
74 1 exist 587|673
75 1 exist 197|319
(...)
1000 ......


No i niestety dalsze pola się nie chcą dodać do bazy, ... dalej już nie wiem co poradzić sad.gif

Proszę o pomoc

W tym wypadku prawdopodobieństwo wylosowania powtarzającej się pary jest mniejsze niż 10%...
redeemer
1) Co zwraca
  1. SELECT COUNT(*) FROM map

2) Jeżeli chcesz to zrobić jednorazowo, to lepiej niech sam PHP wygeneruje 49.000 par i wstawisz je jednym zapytaniem.
PiNkOs
1) 24026
2) Próbowałem pętle ustawiać na 49000 razy, ale po ~1200 był timeout..., jednym zapytaniem nie próbowałem, a warto?
_Borys_
Z rand() jest tak, że co kilkanaście tysięcy albo co kilkadziesiąt tysięcy losowań powtarza się cały ciąg losowanych liczb, użyj mt_rand(), losuje szybciej i o wiele mniejsza powtarzalność ciągu.
PiNkOs
Jasne, teraz wszystko działa jak należy. DZIĘKI!
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.