ugrás a tartalomhoz

Véletlenszerű kiválasztás

bnc1995 · 2011. Okt. 4. (K), 21.54
Sziasztok!

Az lenne a kérdésem hogy hogyan tudok véletlenszerűen kiválasztani egy pontot egy koordináta rendszerből úgy , hogy az origótól kiindulva egyre távolabb adjon meg pontokat, úgy hogy az origo körül egy körzetben megad pontokat és ha ott a pontok 50%-át kiválasztotta tovább lép, és létre hoz egy nagyobb körzetet, és ott is kiválaszt pontokat addig, amíg az 50% meg nem lesz, és így tovább.

Segítségeteket előre is köszönöm.
 
1

Részletek

Poetro · 2011. Okt. 4. (K), 22.15
Kérlek adj meg több részletet, mert ez így eléggé kevés. Ajánlom neked a rand($min, $max) és az mt_rand($min, $max) függvény használatát. Ha egy tömbből akarsz elemeket kiválasztani, akkor pedig array_rand.
2

Például:

bnc1995 · 2011. Okt. 4. (K), 22.26
origo körül létrehozok egy körzetet ami pl. mondjuk a négyzet és csúcsai (6;6),(6;-6),(-6;6),(-6;-6), és ezen belül választ ki pontokat véletlen szerűen addig amíg ki nem választja a négyzetben levő pontok 50%-át, vagyis a négyzetben levő pontok száma 13*13=169 aminek az 50%-a 85. Ezután létrehoz egy nagyobb négyzetet amiben szintén kiválasztja a pontok 50%-át, és szintén létre hoz egy nagyobb négyzetet...
4

Kérdés?

Schmidi · 2011. Okt. 4. (K), 22.33
Nagyjából leírtad a folyamatot, ami alapján meg lehet csinálni.

Mi a konkrét kérdés?
3

Végtelen

Poetro · 2011. Okt. 4. (K), 22.33
Egy négyzeten belül végtelen mennyiségű pont van, így azoknak nem lehet kiválasztani az 50%-át. Ha csak az egész koordinátájú pontok kellenek, akkor pedig az rand/mt_rand segítségével megoldható, illetve, ha egyszerűen akarod megcsinálni, akkor range és array_rand.
8

Másik megközelítés

Poetro · 2011. Okt. 4. (K), 23.03
Kicsit jobban átgondolva a dolgot:

Legenerálod a tömböt, ami tartalmazza az összes koordinátát, mint a tömbelemek kulcsát. Ebből kivonod array_diff_key-jel az előző lépésben megkapott tömbödet. majd array_rand segítségével kiválasztod az elemeket ebből az új tömbből, miközben minden lépésnél eltávolítod a tömbből az elemeket, és figyeled, hogy elérted-e már a kívánt mennyiséget.

Most nem akarom ideírni a kódot, amit írtam, mert szeretném ha te is gondolkodnál rajta.
9

Én így gondoltam

bnc1995 · 2011. Okt. 5. (Sze), 15.38
  1. <?php  
  2. include "config.php";  
  3. $min = -6;  
  4. $max =  6;  
  5. $YX = 0;  
  6. while($YX == 85){  
  7.     $YX++;  
  8.     $X = rand($min,$max);  
  9.     $Y = rand($min,$max);  
  10.     $mysqlconnect = mysql_connect($host,$user);  
  11.     $mysqlselect = mysql_select_db($ser);  
  12.       
  13.     $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";  
  14.     $myselect = mysql_query($select);  
  15.     $data = mysql_fetch_array($myselect);  
  16.       
  17.      if (!isset($data['X']) and (!isset($data['Y'])))  
  18.        {  
  19.         $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";  
  20.         $myinsert = mysql_query($insert);  
  21.        }  
  22.       
  23. }  
  24.   
  25.   
  26.   
  27. ?>  
csak még nem fejeztem be:)
mi a véleményed róla?
10

Lassú

Poetro · 2011. Okt. 5. (Sze), 15.56
Ez nagyon lassú. Miért nem generálod ki előbb a koordinátákat, majd egy lekérdezésben megtudod, mik vannak az adatbázisban, azután a hiányzókat beszúrod. Meg maga while ciklus ellenőrzése is rossz, mivel sose fog így lefutni a ciklus, ráadásul a nagyobb körzetekre nem is fog működni.

Arról nem is beszélve, hogy a beszúrás ellenőrzése is teljesen felesleges, elég lenne ellenőrizni, hogy a kérés adott-e vissza eredményeket.
11

És ez?

bnc1995 · 2011. Okt. 5. (Sze), 21.44
  1. <?php  
  2. include "config.php";  
  3. $min = -6;  
  4. $max =  6;  
  5.   
  6. $X = rand($min,$max);  
  7. $Y = rand($min,$max);  
  8.   
  9. $mysqlconnect = mysql_connect($host,$user);  
  10. $mysqlselect = mysql_select_db($ser);  
  11.       
  12. $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";  
  13. $myselect = mysql_query($select);  
  14. $data = mysql_fetch_array($myselect);  
  15. $rows = mysql_num_rows($myselect);  
  16. if($rows <= 85)  
  17.   {   
  18.    if (!isset($data['X']) and (!isset($data['Y'])))  
  19.       {  
  20.        $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";  
  21.        $myinsert = mysql_query($insert);  
  22.       }  
  23.       
  24.   }  
  25. ?>  
12

Végül erre jutottam...

bnc1995 · 2011. Okt. 6. (Cs), 19.22
  1. <?php    
  2. include "config.php";  
  3.   
  4.   
  5.   
  6. $min = -6;//13*13  
  7. $max =  6;  
  8.   
  9. $X = rand($min,$max);  
  10. $Y = rand($min,$max);  
  11.   
  12. $YX = $min+$max++;  
  13. $YX2 = abs($YX);  
  14. $XY = (2*$YX2)/2;  
  15.         
  16. $mysqlconnect = mysql_connect($host,$user);  
  17. $mysqlselect = mysql_select_db($_POST['ser']);  
  18.   
  19. $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";  
  20. $myselect = mysql_query($select);  
  21. $data = mysql_fetch_array($myselect);  
  22. $rows = mysql_num_rows($myselect);  
  23. if($rows <= $XY)  
  24.   {     
  25.    if (!isset($data['X']) and (!isset($data['Y'])))  
  26.       {  
  27.        $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";  
  28.        $myinsert = mysql_query($insert);  
  29.       }  
  30.   }  
  31. else  
  32.   {  
  33.    $min = -12;  
  34.    $max =  12;  
  35.      
  36.    while(-6 <= $X and $X <=6 or -6 <= $Y and $Y <=6){  
  37.     $X = rand($min,$max);  
  38.     $Y = rand($min,$max);  
  39.    }  
  40.      
  41.    $YX = $min+$max++;  
  42.    $YX2 = abs($YX);  
  43.    $XY = (2*$YX2)/2;  
  44.      
  45.    $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";  
  46.    $myselect = mysql_query($select);  
  47.    $data = mysql_fetch_array($myselect);  
  48.    if ($rows <= $XY)  
  49.       {  
  50.         if (!isset($data['X']) and (!isset($data['Y'])))  
  51.            {  
  52.             $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";  
  53.             $myinsert = mysql_query($insert);  
  54.            }  
  55.       }  
  56.    else  
  57.       {  
  58.        $min = -20  
  59.        $max =  20;  
  60.      
  61.        while(-6 <= $X and $X <=6 or -6 <= $Y and $Y <=6){  
  62.        $X = rand($min,$max);  
  63.        $Y = rand($min,$max);  
  64.        }  
  65.      
  66.        $YX = $min+$max++;  
  67.        $YX2 = abs($YX);  
  68.        $XY = (2*$YX2)/2;  
  69.      
  70.        $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";  
  71.        $myselect = mysql_query($select);  
  72.        $data = mysql_fetch_array($myselect);  
  73.        if ($rows <= $XY)  
  74.           {  
  75.            if (!isset($data['X']) and (!isset($data['Y'])))  
  76.               {  
  77.                $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";  
  78.                $myinsert = mysql_query($insert);  
  79.               }  
  80.           }  
  81.      else  
  82.           {  
  83.              
  84.           }  
  85.       }  
  86.   }  
  87. ?>    
de az a baj, hogy ezeket a hiba üzeneteket kapom:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\reg.php on line 231

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\reg.php on line 232

meg tudnád mondani, hogy mi a baj?
13

$myselect

Poetro · 2011. Okt. 6. (Cs), 19.27
Mivel itt olyan sorra hivatkozik a hiba, ami nincs a fenti kódban, ezért nehéz megmondani, de valószínűleg az egyik query nem tért vissza valós értékkel, ezért a mysql_fetch_array se fog működni (például hibás a query).
5

A kérdés

bnc1995 · 2011. Okt. 4. (K), 22.34
Milyen függvények szükségesek hozzá?
6

Egész számok

bnc1995 · 2011. Okt. 4. (K), 22.37
Elnézést azt elfelejtettem mondani, hogy egész számokról beszélek:)
7

Köszszönöm a segítséget

bnc1995 · 2011. Okt. 4. (K), 22.41
Köszönöm a segítséget