2017-02-07 2 views
1

Ich habe einen Zufallsgenerator mit srand() geschrieben, die ein Array von Zufallszahlen gegebener Größe erstellt. Ich möchte, dass meine Zufallszahlen Werte bis zu 1000.000 annehmen, und um dies zu erhalten, habe ich jeden Eintrag des Arrays als rand()%1000000 im folgenden Code definiert. Das Seltsame ist, dass die zufälligen Werte alle bis zu 30.000 betragen und die größeren Zufallszahlen wie 987.623 nicht erstellt werden, dh die Anzahl der Zahlen der Zufallszahlen ist nicht größer als 5. Hat jemand eine Idee warum das so ist Ereignis? Gibt es einen anderen Weg (Funktion), den Sie anbieten können, um größere Zahlen als diese zu bekommen?Warum ist die Zifferngröße des Zufallsgenerators begrenzt?

#include <iostream> 
#include <fstream> 
#include <stdlib.h> 
#include <time.h> 
#include <cmath> 
#include <vector> 
using namespace std; 

int * rng(int size) { 
    int* a = NULL; 
    a = new int[size]; 
    for (int i = 0; i < size; i++) { 
     a[i] = rand() % 1000000; 
     if (a[i] == 0) { 
      a[i] += 1; 
     } 
    } 
    for (int j = 0; j < size; j++) { 
     cout << a[j] << " "; 
    } 
    delete[] a; 
    a = NULL; 
    return a; 
} 

int main() { 
    srand(time(NULL)); 
    int size; 
    int* x; 
    ifstream myfile("size.txt"); 
    ofstream outfile("input.txt"); 
    while (myfile>>size) { 
     x=rng(size); 
     if (outfile.is_open()) {  
      for(int count = 0; count < size; count ++) { 
       outfile<< x[count] << " " ; 
      } 
     myfile.close(); 
     }  
    } 
    return 0; 
    delete [] x; 
    x = NULL; 
} 
+0

Als Nebenbemerkung erzeugt Ihr Code Speicherverluste, weil alles, was nach dem 'return a;' kommt, nicht ausgeführt wird. Verwenden Sie einen Debugger, um den Code schrittweise zu bearbeiten. –

+0

Danke Raw N 5, ich werde es reparieren. – esra

+2

Mögliches Duplikat von [Erweitere rand() maximale Reichweite] (http://stackoverflow.com/questions/9775313/extend-rand-max-range) –

Antwort

6

RAND_MAX auf Ihrer Maschine ist offensichtlich nahe oder am Minimum von der Norm erlaubt: 32767

Es gibt viele Alternativen zur Verfügung, die eine bessere Periodizität bieten. Mersenne Twister ist eine solch gute Alternative und Teil des C++ 11 Standards.

Beachten Sie auch, dass die Anweisungen nach Ihrer Rückkehr Aussage nicht erreichbar sind. Betrachten Sie eine

std::vector<int> 

als Rückgabetyp.

+0

Genau, siehe http: //www.cplusplus.com/reference/cstdlib/RAND_MAX/ –

+0

Bathseba danke :) – esra

3

According to the documentation, kehrt die Funktion rand() eine Zahl zwischen 0 und RAND_MAX, die wiederum according to the documentation ist -Implementierung definiert. "Implementation Defined" bedeutet "was auch immer Ihr Compiler-Hersteller will". In diesem Fall hat Ihr Compiler-Hersteller entschieden, dass es wahrscheinlich bei etwa 30000, aller Wahrscheinlichkeit nach 32767, liegen sollte, um die Kompatibilität mit einer alten 16-Bit-Version des Compilers zu vermeiden.

Sie könnten einen anderen Compiler wählen, oder Sie könnten einige Trick, wie folgt aus:

int my_random_number = rand()^(rand() << 15); 

Die oben geht davon aus, dass Ihre rand() Funktion verfügt über einen 15-Bit-Bereich (das sind Zahlen von 0 bis 32767), so es verknüpft 15 Bits von einem Aufruf mit weiteren 15 Bits von einem anderen Aufruf, was insgesamt 30 Bits ergibt, was einen Bereich weit größer als die benötigten 0 bis 1.000.000 aufweist. Diese Verkettung wird erreicht, indem das Ergebnis des zweiten Aufrufs um 15 Bits nach links verschoben wird und dann die beiden Ergebnisse XOR-verknüpft werden.

+0

Danke. Ich benutze Dev C++, werde einige andere ausprobieren – esra

+0

"Implementation defined" bedeutet, dass der Compiler-Writer entscheiden kann, was die Implementierung macht, ** vorbehaltlich der Einschränkungen ** im Standard. Für 'RAND_MAX' besteht die Einschränkung darin, dass der Wert mindestens 32767 betragen muss. "Implementierung definiert" bedeutet auch, dass die Implementierung ** ihr Verhalten dokumentieren muss. –

+0

Mike kannst du den Trick ein bisschen erklären? verschiebst du es? – esra

Verwandte Themen