Werte im Vector in zufällige Reihenfolge bringen

CodeIt

Aktives Mitglied
Hallo,

ich möchte gerne den Inhalt eines Vectors in zufälliger Reihenfolge anordnen.

Bisher habe ich folgende Möglichkeiten gefunden:

Code:
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
vector.add(3);
vector.add(4);
vector.add(5);

Random random = new Random();
Vector<Integer> vector2 = new Vector<>();
while(vector.size() > 0){
        int index = random.nextInt(vector.size());
        int wert = vector.elementAt(index);
        vector.removeElementAt(index);
        vector2.add(wert);
}

und

Code:
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
vector.add(3);
vector.add(4);
vector.add(5);

Collections.shuffle(vector);

Die zweite Version finde ich natürlich wirklich einfacher, darüberhinaus fand ich noch die Möglichkeit
Code:
SecureRandom secRand = new SecureRandom();
Collections.shuffle(vector, secRand);

Welche Möglichkeit bewirkt denn nun die zufälligste Reihenfolge der Werte?

Hat vielleicht noch jemand einen besseren Vorschlag?

für jeden Tipp wäre ich sehr dankbar
 
meinst du etwas in diese Richtung ?
Java:
int maxElements = 5;
    Vector<Integer> vector = new Vector<Integer>();
    while(vector.size() < maxElements){
        vector.add((int)(Math.random()*5)+1);
    }
 
Es gibt Pseudozufallszahlen in unterschiedlichster Qualität. Möchtest du wissen, wie man die mit der höchsten Qualität erzeugt?
 
Vielen Dank für die Antworten.
Der Vector enthält bereits die Werte, diese enthaltenen Werte
sollen in eine zufällige Reihenfolge gebracht werden.
Ich frage mich ob es hier besser ist die Werte zufällig einzeln
aus dem Vector zu entnehmen und diese dann in einem anderen
Vector zu speichern oder ist die Anwendung der shuffle-Methode
besser. Was würde mehr einer zufälligen Anordnung entsprechen?
Dann gibt es ja auch noch SecureRandom, welche man zusätzlich
als Parameter in der shuffle-Methode anwenden kann.
Wenn man z.B. einen Vector mit ca. 300 Werten hat, welche
der o.g. Versionen würdet Ihr nehmen? Oder kann mir jemand
eine bessere Methode empfehlen?

Vielen Dank im voraus
 
Zitat: ... sind die Zahlen nicht wirklich zufällig, sondern gehorchen einem mathematischen Verfahren. Kryptografisch bessere Zufallszahlen liefert die Klasse java.security.SecureRandom, die eine Unterklasse von Random ist.

Also würde ich dir die SecureRandom-Variante empfehlen.
 
Oder kann mir jemand
eine bessere Methode empfehlen?

Collections.shuffle ohne SecureRandom ist in den meisten Fällen ausreichend. Selber implementieren ist überflüssig, und die Variante mit SecureRandom braucht man in den wenigsten Fällen.

BTW: rein aus Interesse, warum Vector?

Also würde ich dir die SecureRandom-Variante empfehlen.

In den wenigsten Fällen muss das ganze kryptografisch sicher sein 😉

SecureRandom ist z.B. *deutlich* langsamer, und beeinträchtigt uU auch alle anderen Programme, die wirklich sichere Zufallszahlen brauchen.
 
bewirkt denn nun die zufälligste Reihenfolge der Werte?

Diese:
Java:
    public static void main(String[] args) {
        Vector<String> aVector = new Vector<>(); // (Obsolete Collection)
        aVector.add("Hallo");
        aVector.add("neues");
        aVector.add("jahr");

        shuff(aVector);

        System.out.println(aVector);
    }

    private static <T> void shuff(Vector<T> vector1) {
        Random random = new Random();
        Vector<T> vector2 = new Vector<>();
        for (int i = vector1.size() - 1; i >= 0; i--) {
            vector2.insertElementAt(vector1.remove(i), random.nextInt(vector2.size() + 1));
        }
        vector1.addAll(vector2);

        // Geh nochmal auf nummer Sicher:
        // Collections.shuffle(vector1);
    }

shuff-Methode und Collections.shuffle sind gleichgut. SecureRandom bewirkt keine Verbesserung.

Frohes Neues!
 
Vielen Dank und ein gutes neues Jahr.
Der Code soll nicht für irgendeine Authentifizierung oder
Verschüsselung verwendet werden.
Er soll lediglich die Werte im Vektor zufällig anordnen.
Ich bin mir nur unsicher bezüglich der Zufälligkeit, wenn ich
collections.shuffle(vector) anwende oder wenn ich eben aus
dem Vektor zufällig, mit Random, die Werte entnehme und
diese in einem neuen Vektor speichere, so wie in meiner ersten
oben genannten Version. Aber wenn das stimmt, dass
collections.shuffle den Random-Algorithmus als Default anwendet,
dann dürfte das doch keinen großen Unterschied mehr bezüglich
des Zufalls machen oder?


Collections.shuffle ohne SecureRandom ist in den meisten Fällen ausreichend. Selber implementieren ist überflüssig, und die Variante mit SecureRandom braucht man in den wenigsten Fällen.

BTW: rein aus Interesse, warum Vector?

Die Werte werden ursprünglich aus einem Array entnommen, in
welchem die Reihenfolge der Werte nicht verändert werden soll.
Deshalb entschied ich mich für einen Vector, aus welchem dann die
zufällig angeordneten Werte nacheinander entnommen werden.
 
Vielen Dank und ein gutes neues Jahr.
Der Code soll nicht für irgendeine Authentifizierung oder
Verschüsselung verwendet werden.
Er soll lediglich die Werte im Vektor zufällig anordnen.
Ich bin mir nur unsicher bezüglich der Zufälligkeit, wenn ich
collections.shuffle(vector) anwende oder wenn ich eben aus
dem Vektor zufällig, mit Random, die Werte entnehme und
diese in einem neuen Vektor speichere, so wie in meiner ersten
oben genannten Version. Aber wenn das stimmt, dass
collections.shuffle den Random-Algorithmus als Default anwendet,
dann dürfte das doch keinen großen Unterschied mehr bezüglich
des Zufalls machen oder?
Nein, macht es nicht.

Bei sowas empfiehlt es sich immer, die vorhandenen Methoden zu nutzen 😉

Die Werte werden ursprünglich aus einem Array entnommen, in
welchem die Reihenfolge der Werte nicht verändert werden soll.
Deshalb entschied ich mich für einen Vector, aus welchem dann die
zufällig angeordneten Werte nacheinander entnommen werden.
Das Javadoc empfiehlt da ArrayList, wenn du die Threadsicherheit nicht brauchst 😉
 
Er hatte aber danach gefragt.
Ich müsste jetzt selber nachlesen. Es gibt nicht viele Menschen auf der Welt, die verlässliche Aussagen dazu machen können. 😛
Aber mal mein Vorgehensmodell: Übersetze den Suchbegriff: ist java collections shuffle gut genug? ins Englische (really random enough?, suitable for a poker algorithm? usw), google danach - und nehme den ersten Treffer nach SO, SE, SE.SE usw
 
Aber mit dem Vector funktioniert es auch, was spricht denn gegen
die Verwendung des Vectors?
zB das er deutlich langsamer ist, ist eben die Empfehleung des Javadocs 😉

Ich müsste jetzt selber nachlesen. Es gibt nicht viele Menschen auf der Welt, die verlässliche Aussagen dazu machen können. 😛
Aber mal mein Vorgehensmodell: Übersetze den Suchbegriff: ist java collections shuffle gut genug? ins Englische (really random enough?, suitable for a poker algorithm? usw), google danach - und nehme den ersten Treffer nach SO, SE, SE.SE usw
WTF?
Spielst du grad ne Runde Bullshitbingo und brauchtest noch ein paar Begriffe?
 

Neue Themen


Zurück
Oben