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

<?php
include "config.php";
$min = -6;
$max =  6;
$YX = 0;
while($YX == 85){
    $YX++;
    $X = rand($min,$max);
    $Y = rand($min,$max);
    $mysqlconnect = mysql_connect($host,$user);
    $mysqlselect = mysql_select_db($ser);
    
    $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";
    $myselect = mysql_query($select);
    $data = mysql_fetch_array($myselect);
    
     if (!isset($data['X']) and (!isset($data['Y'])))
       {
        $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";
        $myinsert = mysql_query($insert);
       }
    
}



?>
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

<?php
include "config.php";
$min = -6;
$max =  6;

$X = rand($min,$max);
$Y = rand($min,$max);

$mysqlconnect = mysql_connect($host,$user);
$mysqlselect = mysql_select_db($ser);
    
$select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";
$myselect = mysql_query($select);
$data = mysql_fetch_array($myselect);
$rows = mysql_num_rows($myselect);
if($rows <= 85)
  { 
   if (!isset($data['X']) and (!isset($data['Y'])))
      {
       $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";
       $myinsert = mysql_query($insert);
      }
    
  }
?>
12

Végül erre jutottam...

bnc1995 · 2011. Okt. 6. (Cs), 19.22

<?php  
include "config.php";



$min = -6;//13*13
$max =  6;

$X = rand($min,$max);
$Y = rand($min,$max);

$YX = $min+$max++;
$YX2 = abs($YX);
$XY = (2*$YX2)/2;
      
$mysqlconnect = mysql_connect($host,$user);
$mysqlselect = mysql_select_db($_POST['ser']);

$select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";
$myselect = mysql_query($select);
$data = mysql_fetch_array($myselect);
$rows = mysql_num_rows($myselect);
if($rows <= $XY)
  {   
   if (!isset($data['X']) and (!isset($data['Y'])))
      {
       $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";
       $myinsert = mysql_query($insert);
      }
  }
else
  {
   $min = -12;
   $max =  12;
   
   while(-6 <= $X and $X <=6 or -6 <= $Y and $Y <=6){
    $X = rand($min,$max);
    $Y = rand($min,$max);
   }
   
   $YX = $min+$max++;
   $YX2 = abs($YX);
   $XY = (2*$YX2)/2;
   
   $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";
   $myselect = mysql_query($select);
   $data = mysql_fetch_array($myselect);
   if ($rows <= $XY)
      {
        if (!isset($data['X']) and (!isset($data['Y'])))
           {
            $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";
            $myinsert = mysql_query($insert);
           }
      }
   else
      {
       $min = -20
       $max =  20;
   
       while(-6 <= $X and $X <=6 or -6 <= $Y and $Y <=6){
       $X = rand($min,$max);
       $Y = rand($min,$max);
       }
   
       $YX = $min+$max++;
       $YX2 = abs($YX);
       $XY = (2*$YX2)/2;
   
       $select = "SELECT X, Y FROM users WHERE X='".$X."' Y='".$Y."'";
       $myselect = mysql_query($select);
       $data = mysql_fetch_array($myselect);
       if ($rows <= $XY)
          {
           if (!isset($data['X']) and (!isset($data['Y'])))
              {
               $insert = "INSERT INTO users ('X','Y') VALUES ('".$X."','".$Y."')";
               $myinsert = mysql_query($insert);
              }
          }
     else
          {
           
          }
      }
  }
?>  
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