| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

27-09-2006, 00:23
|
|
3DMax
PHP Senior
|
|
Registriert seit: Jan 2004
Beiträge: 1.916
|
|
langeweile - zufallszahlen-contest
ja, könnte auch ins ot rein - hier ist ja nichts los
habe mal ein altes script von mir rausgekramt.
gesucht: 5 eindeutige zufallszahlen zwischen 1 und 15
bedingung: maximale performance bei z.b. 10.000 schleifendurchläufen
wer hat ein schnelleres script?
PHP-Code:
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
// Stoppuhr anschmeißen
$time1=getmicrotime();
// CODE ========================================================================
$i=0;
while($i<10)
{
$i++;
$k=0;
while($k<10000)
{
$k++;
// Zufallszahlen-Generator initialisieren
srand((double)microtime()*1000000);
// Auf gut Glück fünf Zufallszahlen generieren
$r0=rand(1,15);
$r1=rand(1,15);
$r2=rand(1,15);
$r3=rand(1,15);
$r4=rand(1,15);
// Nach dieser While-Schleife sind die ersten drei Zufallszahlen eindeutig
while($r0==$r1||$r1==$r2||$r0==$r2)
{
$r0=rand(1,15);
$r1=rand(1,15);
$r2=rand(1,15);
}
// Nach dieser While-Schleife sind die ersten vier Zufallszahlen eindeutig
while($r0==$r3||$r1==$r3||$r2==$r3)
{
$r3=rand(1,15);
}
// Nach dieser While-Schleife sind alle Zufallszahlen eindeutig
while($r0==$r4||$r1==$r4||$r2==$r4||$r3==$r4)
{
$r4=rand(1,15);
}
}
// Mal testweise den ganzen Müll ausgeben (10.000 Durchläufe)
echo "$r0, $r1, $r2, $r3, $r4 <br>";
}
// =============================================================================
// Stoppuhr stoppen (wie schon der Name sagt)
$time2=getmicrotime();
// Die fantastische Laufzeit des genialen Algorithmus ausgeben
echo "<br>RUNTIME: ";
echo $time2-$time1;
|

27-09-2006, 00:50
|
|
axo
Junior Member
|
|
Registriert seit: Jan 2006
Ort: 127.0.0.1
Beiträge: 196
|
|
ohje
PHP-Code:
$vals = array_rand(range(0,14,1), 5);
... um meine ausgabe mit deiner identisch zu gestalten, müsste man die zufallswerte zum schluss noch um eins inkrementieren. array_rand gibt die _schlüssel_ des arrays zurück, und nicht die werte selbst - wenn ich mit 0 zu zählen anfange, sind schlüssel und werte in diesem fall identisch und man spart sich einen durchlauf.
 srand ist im übrigen seit 4.2.0 obsolet.
Geändert von axo (27-09-2006 um 00:56 Uhr)
|

27-09-2006, 01:20
|
|
Slava
PHP Senior
|
|
Registriert seit: Nov 2002
Ort: Köln
Beiträge: 1.583
|
|
Zitat:
Original geschrieben von axo
ohje
PHP-Code:
$vals = array_rand(range(0,14,1), 5);
... um meine ausgabe mit deiner identisch zu gestalten, müsste man die zufallswerte zum schluss noch um eins inkrementieren.
|
neee
man macht einfach range(1,15)
in jedem fall ist deine Version einwenig kürzer als bei 3DMax.
getestet habe ich es nicht, aber ich glaube, dass es auch schneller ist.
|

27-09-2006, 01:32
|
|
3DMax
PHP Senior
|
|
Registriert seit: Jan 2004
Beiträge: 1.916
|
|
Zitat:
Original geschrieben von axo
srand ist im übrigen seit 4.2.0 obsolet.
|
wie gesat, das script ist älter.
array_rand ist mehr als doppelt so schnell!
|

27-09-2006, 08:43
|
|
axo
Junior Member
|
|
Registriert seit: Jan 2006
Ort: 127.0.0.1
Beiträge: 196
|
|
Zitat:
Original geschrieben von Slava
neee
man macht einfach range(1,15)
|
nein: http://de3.php.net/array_rand
Zitat:
|
If you are picking only one entry, array_rand() returns the key for a random entry. Otherwise, it returns an array of keys for the random entries.
|
führt in unserem fall dazu, dass auch bei range(1,15) die 0 als wert zugelassen wird.
|

27-09-2006, 09:26
|
|
axo
Junior Member
|
|
Registriert seit: Jan 2006
Ort: 127.0.0.1
Beiträge: 196
|
|
wobei:
PHP-Code:
$bla = range(0,15);
unset($bla[0]);
$vals = array_rand($bla, 5);
... jetzt passts. alle werte von 1 bis 15 ...
|

27-09-2006, 11:13
|
|
Slava
PHP Senior
|
|
Registriert seit: Nov 2002
Ort: Köln
Beiträge: 1.583
|
|
ich bin davon ausgagengen, dass man sowieso ausgabe mit echo machen muss.
PHP-Code:
$a=range(1,15);
$v=array_rand($a, 5);
//kann man auch ohne schleife $a[$v[0]] ...
foreach($v as $v){echo $a[$v].",";}
|

27-09-2006, 11:30
|
|
Trashar
PHP Senior
|
|
Registriert seit: Dec 2001
Ort: /root/
Beiträge: 1.366
|
|
foreach($v as $v) ???!
na was geht daran nicht?
|

27-09-2006, 12:41
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.342
|
|
Zitat:
Original geschrieben von Trashar
foreach($v as $v) ???!
na was geht daran nicht?
|
Das würde ich auch mal gerne wissen.....
(Dir ist aber schon klar, daß foreach eine interne Kopie des Arrays anlegt, oder?)
|

27-09-2006, 12:49
|
|
Slava
PHP Senior
|
|
Registriert seit: Nov 2002
Ort: Köln
Beiträge: 1.583
|
|
Zitat:
Original geschrieben von Trashar
foreach($v as $v) ???!
na was geht daran nicht?
|
was soll da nicht gehen?
|

27-09-2006, 13:59
|
|
Trashar
PHP Senior
|
|
Registriert seit: Dec 2001
Ort: /root/
Beiträge: 1.366
|
|
überschreiben die sich nicht?!
ich habs nicht ausprobiert nur mal so von der logik her..
|

27-09-2006, 14:01
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.342
|
|
Nein!
Das tuts so!
Nach Ablauf der Schleife, ist in $v natürlich nur das letzte Arrayelement.
|

28-09-2006, 02:14
|
|
Breezzer
Registrierter Benutzer
|
|
Registriert seit: Nov 2005
Beiträge: 85
|
|
nur mal so ne frage:
wie zum teufel kommt man auf die idee, ein script wie im ersten post zu schreiben?^^
|

28-09-2006, 02:17
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.342
|
|
Langeweile.?..  !
Übrigens, es besteht die (zugegebenermaßen geringe) Gefahr, daß das Script aus dem ersten Posting nie endet.
Meines Erachtens nach, könnte ein Zufallsgenerator wochenlang nur 3en liefern..
was passiert dann in den while Schleifen, da oben...
Geändert von combie (28-09-2006 um 02:58 Uhr)
|
| Themen-Optionen |
|
|
| Ansicht |
Thema bewerten |
Linear-Darstellung
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|