2016-12-14 2 views
4

Ich habe einen Nummernpool (zB {3,6,7,11,20}) und ich brauche jede Nummer in der sie erscheinen meine Sammlung x mal.Wie man eine Zufallszahl aus einem Pool von Zahlen erzeugt, die einander nicht folgen

Meine Lösung war, eine Klasse zu erstellen, nennen wir es "Element", von zwei ganzen Zahlen (num, numOfAppearnces).

Ich habe einen Pool von "Elementen" in ArrayList erstellt und dann eine Zufallszahl zwischen 0 bis list.size generiert und die Zahl im Zufallsindex gespeichert. Wenn numOfAppearances auf 0 gesunken ist, löschte ich dieses Element aus der Liste.

meine Frage ist, gibt es eine andere elegante Lösung zur Generierung von Zufallszahlen, nicht aus einem Bereich?

+0

würde ich vorschlagen, "Searching", bevor Sie fragen. http://stackoverflow.com/questions/2019417/access-random-item-in-list –

+0

Ich würde ähnlich wie Ihre Lösung tun, sondern nur in ein Array und erzeugen Sie eine Zufallszahl zwischen 0-array.size und verwenden Sie das als ein Index. – nesohc

+0

Die "beste" Lösung für dieses Problem hängt vom Wert von 'x' ab. Wenn es hoch ist und die Anzahl der verschiedenen Werte ebenfalls hoch ist und die Speichernutzung ein Problem darstellt, kann eine speichereffizientere Lösung gerechtfertigt sein. Ansonsten lege einfach alle Zahlen (einschließlich 'x' Kopien) in ein Array und mische es. –

Antwort

6

Ja, es gibt kürzere Wege, um das zu erreichen, was Sie beschreiben.

Zum Beispiel:

Integer[] arr = {3,6,7,11,20}; 
List<Integer> shuffled = new ArrayList<>(); 
for (Integer i : arr) 
    shuffled.addAll (Collections.nCopies(x,i)); // add i to your List x times 
Collections.shuffle(shuffled); // shuffle the List to get random order 

Oder (wenn Sie nicht Collections.nCopies(x,i) verwenden wollen):

Integer[] arr = {3,6,7,11,20}; 
List<Integer> shuffled = new ArrayList<>(); 
for (int j = 0; j < x; j++) 
    for (Integer i : arr) 
     shuffled.add (i); 
Collections.shuffle(shuffled); // shuffle the List to get random order 
0

hier ist einfach Python-Programm

import random 
def genRNum(): 
    numlist = [3,6,7,11,20] 
    i = random.randrange(0,4) 
    RNum = numlist[i] 
    print(RNum) 

genRNum() 
0

Ein weiterer einfachste Weg ist, Verwenden von Windows PowerShell

Get-Random 3,6,7,11,20

That't es

+1

Aus dem OP: 'Ich brauche jede Nummer x mal in meiner Sammlung erscheinen. Sie sprechen diese Anforderung nicht an. –

Verwandte Themen