32/64-Bit Problem mit random()
-
Hi,
habe jetzt Zugriff auf nen Rootie EQ-4 von Hetzner (Intel Core i7 CPU)
mit installierten openSUSE-112-64-minimal.Folgendes Mini-Programm compiliert mit "g++ -march=x86-64 -O2 test.cpp"
liefert jedoch anscheinend für alle srandom-Parameter > 2147483647
andere Ausgaben als auf den 64-Bit-Rechnern mit AMD-Prozessoren,
die ich bislang hatte, z.B.using namespace std; #include <iostream> #include <stdlib.h> main() { // Ausgabe 2042656123, identisch zu auf AMD-64-Bit-Rechnern srandom((unsigned int)1111111111l); cout << random() << endl; // Ausgabe: 1547357795, auf AMD-64-Bit-Rechnern 914282340 srandom((unsigned int)2222222222l); cout << random() << endl; }
Was ist hier die Ursache für die Abweichung bei seed > 2147483647 ?
g++ -v:
Using built-in specs. Target: x86_64-suse-linux Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.4 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=generic --build=x86_64-suse-linux Thread model: posix gcc version 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux)
uname -a:
Linux openSUSE-112-64-minimal 2.6.31.12-0.2-default #1 SMP 2010-03-16 21:25:39 +0100 x86_64 x86_64 x86_64 GNU/Linux
cat /proc/cpuinfo:
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 26 model name : Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz stepping : 5 cpu MHz : 1600.000 cache size : 8192 KB physical id : 0 siblings : 8 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm ida tpr_shadow vnmi flexpriority ept vpid bogomips : 5346.48 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 1 ...
-
Das hat nichts mit 32 oder 64 bit zu tun, sondern liegt einfach daran, dass der bei rand() verwendete PRNG-Algorithmus nicht im Standard festgelegt ist. Da nimmt also jeder, was er gerade für besser hält.
Wenn die Zufallszahlenfolgen reproduzierbar sein müssen, ist rand() demnach völlig ungeeignet. Nimm lieber den Mersenne-Twister.
-
Athar, danke der Info.
Mersenne-Twister sagt mir nichts bislang,
aber ich werde es mir anschauen.