WinFuture-Forum.de: Zufallszahl überprüfen ... - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Zufallszahl überprüfen ...


#1 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

  geschrieben 15. November 2007 - 22:01

Hey liebe Community,

ich habe da ein kleines Problem. Seit ca. 6 Monaten hab ich nix mehr mit PHP und MySQL gemacht und jetzt muss ich mich wieder 'einüben'.

Ich habe ein Vokabeltrainer gebastelt, funktioniert auch super bis auf einen kleinen Fehler:
Wenn man dort Vokabeln eingibt, werden diese in eine MySQL-Datenbank gespeichert und jedes dieser Vokabeln bekommt natürlich seine ID (index)! So, ich habe des Vokabeltrainer getest und aus spaß ein paar Vokabeln eingegeben und abfragen lassen. 5 Vokabeln waren es, welche ich wieder gelöscht hab.

Durch ein Zufallsprinzip wird eine Ganzzahl ausgegeben und diese Ganzzahl ist dann die Zahl, die bestimmt welche Vokabel abgetragt wird. Z.B.: 5 -> lade Vokabel aus der DB mit dem index 5.

Zu doof, dass die neueingegebenen Vokabeln ab 5 weiter gezählt werden. Wenn durch das Zufallsprinzip z.B. die 3 ausgegeben wird, dann wird versucht, die Vokabel mit dem index 3 aus der DB zu laden aber diese wurde ja gelöscht, darum zeigt er mir nichts an.

Zu meiner Frage:
Ich brauche eine Funktion, welche überprüft ob die durch das Zufallsprinzip generierte Zahl überhaupt als index in der DB existiert, müsste doch mit einer WHILE-Schleife super gehen, leider hab ich es nicht mehr im Kopf. Könnt ihr mir dabei helfen? Wäre euch sehr dankbar.

...
include('db_con.php');

$zaehle="SELECT * FROM vokabeln";
$anzahl=mysql_query($zaehle);
$zeilen=mysql_num_rows($anzahl);

srand(microtime()*1000000);
$zufall = rand(1,$zeilen);

$sql = "SELECT * FROM vokabeln WHERE id='".$zufall."';";
$result = mysql_query($sql);
$row=mysql_fetch_object($result);
...


MfG, Nick

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

Anzeige



#2 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 15. November 2007 - 22:20

Hi,

eine zufällige Vokabel auswählen, kannst du auch direkt mit einer MySQL-Abfrage erledigen:

SELECT ...
FROM vokabeln AS d1 JOIN
	(SELECT (RAND() *
		(SELECT MAX(id) FROM vokabeln)) AS id)
	AS d2
WHERE d1.id >= d2.id
ORDER BY d1.id ASC
LIMIT 1;


Für ... die jeweiligen Spalten eintragen, die du benötigst. Das erhöht die Performance gegenüber einer Abfrage mit *.

Leider ist es nicht mehr so ganz zufällig, wenn große Bereiche aufeinanderfolgender IDs gelöscht wurden, da immer zum nächstgrößten gesprungen wird, wenn für die Random ID selber kein Eintrag existiert.

Gruß,
Stefan
0

#3 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

geschrieben 15. November 2007 - 22:41

Ich möchte gern auf diese Funktion verzichten. Aber danke für den Tip! ;)

so hab ich mir das vorgestellt:

while(?) {
generiere zahl;
wenn zahl in der db existiert dann arbeite mit dieser zahl;
wenn nicht dann generiere weiter;
}

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

#4 Mitglied ist offline   dblay 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.246
  • Beigetreten: 18. März 07
  • Reputation: 1

geschrieben 16. November 2007 - 14:40

Mach's doch einfach so, dass du zuerst alle IDs der Vokabeln aus der DB ausliest und in ein Array schreibst. Das Array wird dabei wieder von null an durchgezählt.

$sql = "SELECT id FROM vokabeln";
$sql_result = mysql_query($sql);

if(mysql_num_rows($sql_result)) {
  while($sql_row = mysql_fetch_assoc($sql_result)) {
	$id_array[] = $sql_row['id'];
  }
}


Wenn dir dein Zufallsgenerator jetzt eine Zahl ausspuckt, kannst du die ohne Weiteres in eine ID "zurückverwandeln"

$id = $id_array[$zufallszahl];


Sollte gehen :smokin:
Zeit ist, was verhindert, dass alles gleichzeitig passiert.
0

#5 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 16. November 2007 - 14:45

Hi,

wenn du das in PHP machst, bremst es halt alles aus, aber das ist natürlich auch realisierbar: (Der Code wurde nicht auf Korrektheit geprüft und rein aus meinen Gedächtnis heraus geschrieben, also keine Garantie, dass der so läuft.)

//die größte ID rausfinden
$result = mysql_query("SELECT MAX(id) FROM vokabeln;");
$row = mysql_fetch_row($result);
$max_id = $row[0];

do { //mach es auf jeden Fall einmal
	$rand_id = mt_rand(0,$max_id); //zufällige Zahl zwischen 0 und $max_id erzeugen
	$result = mysql_query("SELECT ... FROM vokabeln WHERE id='".$rand_id."';");
} while (mysql_num_rows($result) != 1); //und mach es solange nochmal, bis wir einen Datensatz zurückbekommen

...


Langsam (aber bei nicht zu großen Tabellen immer noch schneller als die PHP Variante) - und zufällig - kann das auch MySQL machen:
SELECT ... FROM vokabeln ORDER BY RAND() LIMIT 1;


Gruß,
Stefan

Dieser Beitrag wurde von Diewie bearbeitet: 16. November 2007 - 14:46

0

#6 Mitglied ist offline   Hawk18x 

  • Gruppe: Mitglieder
  • Beiträge: 14
  • Beigetreten: 02. Oktober 06
  • Reputation: 0

geschrieben 16. November 2007 - 15:33

Du willst willkürlich 5 vokabeln auslesen. Wenn ich das richtig verstanden habe,

dann versuch das hier mal, vielleicht klappts:

<?php
$ersteID=mysql_result(mysql_query("SELECT Id FROM `vokabeln` ORDER BY ID ASC LIMIT 1"),0);
$letzteID=mysql_result(mysql_query("SELECT Id FROM `vokabeln` ORDER BY ID DESC LIMIT 1"),0);

$vokanzahl=5;

$vokarray=array();

do
{
  $generateID=rand($ersteID,$letzteID);
  $checkID=mysql_query("SELECT vokabel FROM `vokabeln` WHERE id='".$generateID."');
  if($checkid){
	$vokarray[$x]=mysql_result(mysql_query("SELECT vokabel FROM `vokabeln` WHERE id='".$generateID."'),0);
  }
}
while ( sizeof($vokarray) == $vokanzahl );

print_r($vokarray);
?>


Das bisschen hier liest die 1. vorhandene und die letzte ID der Tabelle aus und eine do-while-schleife generiert ein array mit 5 Vokabeln.

Hoffe, es hilft vielleicht.

Dieser Beitrag wurde von Hawk18x bearbeitet: 16. November 2007 - 15:40

0

#7 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

geschrieben 16. November 2007 - 16:35

Hey! Super Leute.
Danke euch vielmals!

Hawk18x nein du hast es falsch verstanden :smokin:

Läuft alles super
Link: klick

Und... ich hab noch ein kleines Problem: Wenn man eine Vokabel zuvor schon eingetippt hat und diese wieder zufällig ausgewählt wird, dann erschein sie automatisch wenn man den ersten Anfangsbuchstaben eintippt. Quasi die Erinnerungsfunktion wird ausgelöst... wie kann ich das verhindern?

Möglichst für Firefox und IE ...

EDIT:

<form action="#" method="post" autocomplete="off"> ...

ist die Lösung! ;)

Dieser Beitrag wurde von K050V4 bearbeitet: 16. November 2007 - 21:29

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0