2016-08-21 5 views
-2

Was ist die einfachste und schnellste Möglichkeit, N (sagen wir 50.000) zufällige eindeutige Sequenzen der Länge L (sagen wir 1000) mit 1s und 0s in Java zu generieren? Ich brauche das als Pseudozufallsgenerator - Wenn man einen bestimmten Seed als Eingabe verwendet, sollte das Programm immer dazu führen, dass die gleichen Sequenzen erzeugt werden, egal wie oft es ausgeführt wird.Generieren Sie eine Sequenz von zufälligen 1s und 0s

Diese Änderung ist für die Downvoters dieser Frage - random.nextInt() oder random.nextDouble() gibt mir eine ganze Zahl oder einen doppelten Wert, aber ich brauche eine Sequenz von 1s und 0s. Wenn ich eine Folge von 1s und 0s benötige, die der zufälligen Ganzzahl entsprechen, die von random.nextInt() erzeugt wird, muss ich das in ein binäres Array umwandeln? Und ich muss das 50.000 mal machen? Das sind 50.000 * 32? Ich habe mich gefragt, ob es eine schnellere Annäherung gibt. Und das ist der Zweck dieser Frage.

+1

Mögliche Duplikate von [Java Zufallszahlen mit einem Seed] (http://stackoverflow.com/questions/12458383/java-random-numbers-using-a-seed) –

+1

Dies ist eine interessante Frage, bitte posten Sie zuerst Versuchen! –

+1

random.nextInt() oder random.nextDouble() gibt mir einen ganzzahligen oder doppelten Wert, aber ich brauche eine Sequenz von 1s und 0s. Wenn ich eine Folge von 1s und 0s benötige, die der zufälligen Ganzzahl entsprechen, die von random.nextInt() erzeugt wird, muss ich das in ein binäres Array umwandeln? Und ich muss das 50.000 mal machen? Das sind 50.000 * 32? Ich habe mich gefragt, ob es einen schnelleren Ansatz gibt. – brisbeck

Antwort

1

Der Basisalgorithmus kann genug sein:

Mit n = 50000 und l = 1000 die Kollisionsrate ist nahe Null.

public static void main(String args[]) throws Exception { 
    int n = 50000; 
    int l = 1000; 
    long seed = 0L; 
    for (BitSet bitSet : createSequeces(n, l, seed)) { 
     for (int i = 0; i < l; i++) { 
      System.out.print(((bitSet.get(i)) ? "0" : "1")); 
     } 
     System.out.println(); 
    } 
} 

public static Set<BitSet> createSequeces(int n, int length, long seed) { 
    // check 2^length < n 
    Set<BitSet> set = new HashSet<>(); 
    Random rand = new Random(seed); 
    while (set.size() < n) { 
     set.add(createRandom(rand, length)); 
    } 
    return set; 
} 

private static BitSet createRandom(Random rand, int length) { 
    BitSet secuence = new BitSet(length); 
    for (int i = 0; i < length; i++) { 
     secuence.set(i, rand.nextBoolean()); 
    } 
    return secuence; 
} 
+0

Ich würde das BitSet aus einem byte [] -Array konstruieren (in einer einzigen Operation aus Random angefordert), das reduziert die Aufrufe enorm. "BitSet.valueOf (b)". Wenn die Länge nicht ein Vielfaches von 8 Bits ist, würde ich einfach aufrunden. – eckes

+0

Fragen Sie sich auch, ob das deterministisch wäre? Bei einem Start-Seed sollten die generierten Sequenzen gleich sein. – brisbeck

+0

Ja, das Seeding sollte außerhalb der createSequence() erfolgen – eckes

0

Initialisieren Sie den Zufallsgenerator mit dem Samen, dann von dort aus etwas so einfachen wie dies tut:

String myString = ""; 
double toDetermine = random.nextDouble(); 
if(toDetermine < 0.5) { 
    myString+="1" } 
else { 
    myString+="0"; } 
0

Sie könnten eine zufällige Folge von hexadezimalen Ziffern erzeugen, [0..9, A. .F] und konvertiert die Zeichenfolge am Ende in binär. 1.000 Binärziffern sind 250 Hexadezimalziffern.

Wenn Sie möchten, dass die 1.000 Bits eindeutig sind, dann verwenden Sie einfach Steganographie, um einen Zähler in der Sequenz auszublenden. 50.000 ist 0xC350, das sind vier Hex-Ziffern in der 250, die Sie auswählen werden. Pick zufalls 246 hex Ziffern und ein (nicht ersetzen), um die vier Hex-Stellen eines Zählers [0x0001 -> 0xC350] in, sagen wir, Positionen 31, 96, 142 und 206.

In Pseudo-Code:

function randomBinary(counter) 

    hexString <- "" 

    for i in [1..250] 
    if (i = 31) hexString.append(first hex digit of counter) 
    else if (i = 96) hexString.append(second hex digit of counter) 
    else if (i = 142) hexString.append(third hex digit of counter) 
    else if (i = 206) hexString.append(fourth hex digit of counter) 
    else hexString.append(randomHexDigit()) 
    endfor 

    return toBinary(hexString) 

endfunction 

Der Ausgang ist garantiert eindeutig, wenn der angegebene Zähler eindeutig ist. Ein wiederholter Zähler erzeugt wahrscheinlich eine eindeutige Ausgabe, aber das ist nicht garantiert. Die einfache Steganographie ist nicht kryptographisch sicher. Verwenden Sie diese Methode also nicht, wenn Sie kryptografische Sicherheit wünschen.

Verwandte Themen