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.


Anmelden zum Antworten