Blaubart: shuffle

Beitrag lesen

Tach.

Nun hab ich das geschätzte 60mal nacheinander gemacht, und genau drei(!) verschiedene Ergebnisse herausbekommen: eines anfangs ein- oder zweimal, danach ca. 40mal folgendes:

Das kann ich mit folgendem Testcode nicht nachvollziehen:

  
for ($i = 0; $i < 30; $i++) {  
	$arr = array(1,3,5,7,9);  
	printArr($arr);  
	echo " -> ";  
	shuffle($arr);  
	printArr($arr);  
	echo "\n";  
}  
  
function printArr($a) {  
	for ($i = 0; $i < sizeof($a); $i++) {  
		echo $a[$i];  
	}  
}  

Den habe ich zwar unter PHP 5.2 laufen lassen, aber an shuffle und dem restlichen Kram für Zufallszahlen konnte ich in den C-Sources keine Änderungen feststellen. Sollte also die gleichen Ergebnisse liefern wie unter PHP 5.3.

Ich nutze PHP 5.3, laut Handbuch muss shuffle seit PHP 4.2 nicht mehr initialisiert werden.

Richtig. Die entsprechende Funktion überprüft selber, ob der Generator bereits einmal initialisiert wurde und tut diese ggf. selber, bevor ein Ergebnis berechnet wird.

Was nimmt denn PHP als Input fürs Initialisieren? Die aktuellen Minuten? :-) Kann ja nicht deren Ernst sein.

Nein. Aus ext/standard/php_rand.h:

  
#ifdef PHP_WIN32  
#define GENERATE_SEED() (((long) (time(0) * GetCurrentProcessId())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))  
#else  
#define GENERATE_SEED() (((long) (time(0) * getpid())) ^ ((long) (1000000.0 * php_combined_lcg(TSRMLS_C))))  
#endif  

Die Funktion php_combined_lcg findest Du in ext/standard/lcg.c, falls Dich die Details der Initialisierung interessieren.

Hat jemand Ideen, was da los ist?

Zeig erstmal Deinen Testcode. ;)

--
Always remember that you are unique. Just like everybody else.