"We are back" « oc.at

[REQ] Programm für zufällige Sitzordnung

D-Man 13.01.2014 - 19:14 3447 9
Posts

D-Man

knows about the word
Avatar
Registered: Feb 2003
Location: nrw.de
Posts: 5883
Guten Abend zusammen,

ich bin mir nicht sicher ob ich hier richtig bin, falls nicht bitte verschieben ;)

Ich benötige ein kleines Programm, das mir für zehn Personen eine zufällige Sitzordnung ausspuckt. Vielleicht hat jemand soetwas ja eh rumliegen oder wäre bereit dazu, das "mal eben" (?) zu programmieren. :)

Konkret geht es um unseren Kegelclub und es handelt sich immer um die selben Personen. Mir würde es schon reichen, wenn die Namen den Zahlen 1 bis 10 zugeordnet werden, benötige also nichts grafisches.
Ich habe keine Ahnung wie groß der Aufwand für soetwas ist, deswegen halte ich meine Ansprüche gering.

Die Extended Version wäre dann mit Gastkeglern, bzw. austauschbaren Namen und einer grafischen Ansicht, aber das hat wirklich keine Priorität!

Vielen Dank schon mal falls sich jemand dazu berufen fühlen sollte ;)
lG
D-Man

wacht

pewpew
Avatar
Registered: May 2010
Location: Wien
Posts: 1792
Zitat von D-Man
Zahlen 1 bis 10 zugeordnet werden, benötige also nichts grafisches.

So ala Random Sequence of Numbers?

smashIt

master of disaster
Avatar
Registered: Feb 2004
Location: OÖ
Posts: 5284
reicht dir auch ein link?

http://www.random.org/sequences/?mi...tml&rnd=new


----------edit------------
too late.....

D-Man

knows about the word
Avatar
Registered: Feb 2003
Location: nrw.de
Posts: 5883
theoretisch ja :) mir ist als war ich auf der seite, wieso hab ich das denn nicht gesehen :confused: so muss ich nur mit nem überlappenden fenster die namen daneben setzen und fertig :D

Aeefire

Big d00d
Registered: Sep 2010
Location: OÖ
Posts: 176
mal im (java angelehnten)pseudocode, falls du doch noch selbst ein script o.ä. schreiben (lernen) willst:

Code:
public void main(String[]args){
   int numPlayers = 10;
   Queue<Integer> playerQueue = new Queue<Integer>();
   List<Integer> alreadyChosenSeats = new ArrayList<Integer>();
   Random rand = new Random();

   for(int i = 0; i < numPlayers; i++){
     playerQueue.add(i);
   }
   while(!q.isEmpty()){
      int newSeat;
      do{
         newSeat = rand.nextInt(numPlayers);
      }while(alreadyChosenSeats.contains(newSeat));
      alreadyChosenSeats.add(newSeat);
      System.out.println("player "+q.pop()+" on seat: "+newSeat);
   }
}

oder so ähnlich. Nur falls du interessiert sein solltest, sowas auch zu verstehen.
gemacht wird nix anderes als eine Liste(eigentlich "Queue") mit den Spielern zu erstellen (jeder spieler bekommt eine nummer von 0 bis n-1)
und eine mit den schon besetzten plätzen.
Solang die Liste mit den Spielern nicht leer ist und der platz nicht besetzt, wird ein zufälliger platz zwischen 0 und n-1 ausgewählt.

Das geht natürlich noch viel performanter (besonders um die vielen random aufrufe zu verhindern, wenn nurmehr wenige sitzplätze über sind usw.) aber das würde das ganze jetzt unnötig verkomplizieren :)

edit:

worauf weiter hinten hingewiesen wird:
algorithm à la that:

Berechne eine zufällige Position zwischen diesem "Slot" und dem letzten (jeweils inklusive) und vertausche den Eintrag mit dem an der gewählten Position

Code:
public void main(String[]args){
   int numPlayers = 10;
   Random rand = new Random();
   int[] seat = new int[numPlayers];
 
   for (int i = 0; i < seat.length; i++){
        seat[i]= i; // array initialisieren mit den spielernummern
   }

   for (int i = 0; i < seat.length; i++){
             int newPos = i + rand.nextInt(seat.length - i);
             int temp = seat[newPos];
             seat[newPos] = seat[i];
             seat[i] = temp;
    }
             
}

das Ding hat dann O(n) ..
Bearbeitet von Aeefire am 05.02.2014, 14:51

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
Zitat von Aeefire
Das geht natürlich noch viel performanter (besonders um die vielen random aufrufe zu verhindern, wenn nurmehr wenige sitzplätze über sind usw.) aber das würde das ganze jetzt unnötig verkomplizieren :)

Nachdem ich diesen Unfug in jungen Jahren auch mal gemacht habe, würde ich eher zu einem Verfahren mit linearer Laufzeit raten, das sogar viel einfacher ist. :)

- Einmal von vorne bis hinten durchs Array gehen
- Für jeden Eintrag: Berechne eine zufällige Position zwischen diesem "Slot" und dem letzten (jeweils inklusive) und vertausche den Eintrag mit dem an der gewählten Position
- Fertig!

Aeefire

Big d00d
Registered: Sep 2010
Location: OÖ
Posts: 176
Zitat von that
Nachdem ich diesen Unfug in jungen Jahren auch mal gemacht habe, würde ich eher zu einem Verfahren mit linearer Laufzeit raten, das sogar viel einfacher ist. :)

- Einmal von vorne bis hinten durchs Array gehen
- Für jeden Eintrag: Berechne eine zufällige Position zwischen diesem "Slot" und dem letzten (jeweils inklusive) und vertausche den Eintrag mit dem an der gewählten Position
- Fertig!

hab' ich garnicht dran gedacht. man fängt irgendwann an zu kompliziert zu denken ... brrrr... :D

D-Man

knows about the word
Avatar
Registered: Feb 2003
Location: nrw.de
Posts: 5883
Also selber Programmieren wollte ich nicht, das hat mir früher schon nicht gelegen ;) :rolleyes:

Smut

takeover &amp;amp; ether
Avatar
Registered: Feb 2003
Location: VIE
Posts: 16867
Zitat von smashIt
reicht dir auch ein link?

http://www.random.org/sequences/?mi...tml&rnd=new


----------edit------------
too late.....

ziemlich random :D
war jetzt sicher bei 5/10 versuchen die nummer 10 an 1. stelle - aber ja - für dein vorhaben reicht es sicher.

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
Zitat von Smut
ziemlich random :D
war jetzt sicher bei 5/10 versuchen die nummer 10 an 1. stelle - aber ja - für dein vorhaben reicht es sicher.

Das haben Zufallszahlen halt so an sich (die behaupten ja, qualitativ hochwertige Zufallszahlen zu haben). Du wirst auch 10 Versuche machen können, wo die 10 nie an 1. Stelle steht. :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz