Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]Problem z losowaniem par liczb, Funkcja rand()
PiNkOs
post 6.07.2013, 14:34:38
Post #1





Grupa: Zarejestrowani
Postów: 76
Pomógł: 4
Dołączył: 27.02.2009

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


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%...

Ten post edytował PiNkOs 6.07.2013, 14:42:04
Go to the top of the page
+Quote Post
redeemer
post 6.07.2013, 14:54:45
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


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.


--------------------
Go to the top of the page
+Quote Post
PiNkOs
post 6.07.2013, 14:58:46
Post #3





Grupa: Zarejestrowani
Postów: 76
Pomógł: 4
Dołączył: 27.02.2009

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


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?
Go to the top of the page
+Quote Post
_Borys_
post 6.07.2013, 14:59:05
Post #4





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

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


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.
Go to the top of the page
+Quote Post
PiNkOs
post 6.07.2013, 15:03:04
Post #5





Grupa: Zarejestrowani
Postów: 76
Pomógł: 4
Dołączył: 27.02.2009

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


Jasne, teraz wszystko działa jak należy. DZIĘKI!
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: 12.06.2025 - 14:59