[REQ] Programm für zufällige Sitzordnung

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/req-programm-fuer-zufaellige-sitzordnung_237575/page_1 - zur Vollversion wechseln!


D-Man schrieb am 13.01.2014 um 19:14

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 schrieb am 13.01.2014 um 19:34

Zitat von D-Man
Zahlen 1 bis 10 zugeordnet werden, benötige also nichts grafisches.

So ala Random Sequence of Numbers?


smashIt schrieb am 13.01.2014 um 19:37

reicht dir auch ein link?

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


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


D-Man schrieb am 13.01.2014 um 19:44

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 schrieb am 04.02.2014 um 15:01

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) ..


that schrieb am 04.02.2014 um 22:16

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 schrieb am 05.02.2014 um 14:31

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 schrieb am 05.02.2014 um 15:22

Also selber Programmieren wollte ich nicht, das hat mir früher schon nicht gelegen ;) :rolleyes:


Smut schrieb am 05.02.2014 um 15:57

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 schrieb am 05.02.2014 um 21:22

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. :)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025