2008-10-12 12 views
6

Wie generieren Sie eine Zufallszahl innerhalb eines Bereichs unter Ausschluss bestimmter Bereiche? Z.B. Bereich von 1-10, aber nicht in 2-4 oder 7 Lösungen die ich bisher benutzt habe:Generieren einer Zufallszahl ohne Bereich

  • einen zufälligen einen Test erzeugen, wenn es innerhalb des dis-erlaubten Bereichs ist. Basierend auf dem Ergebnis geben Sie entweder die Nummer aus oder versuchen Sie es erneut.
  • Karte erlaubt reicht bis zu einem einheitlichen Bereich. Holen Sie sich eine Zufall zwischen 1 und 6 und dann Karte zurück (dh 6 wird 10).
  • Erstellen Sie erlaubte Bereiche (1-1,5-6,8-10). Wählen Sie zufällig einen Bereich (optional verwenden Sie Gewichte) und eine Nummer in ausgewählten Bereich.

Was ist Ihre Lösung?

Antwort

8

(b) Verwenden Sie den einzelnen Bereich und ordnen Sie den zulässigen Werten zu.

(a) Ist langsamer und die Laufzeit ist nicht deterministisch, weil Sie warten müssen, bis Sie eine Zahl im richtigen Bereich erhalten. Wenn Sie eine große Auswahl überspringen würden, würden Sie abgespritzt werden.

(c) ist komplexer als (b); Fügen Sie keine Komplexität hinzu, wenn dies nicht erforderlich ist.

+0

(c) müssen auch gewichtete Bereiche verwenden. Andernfalls betrachten Sie: 0..10, 20..80, 90..100; Es gibt drei Bereiche, aber wenn die Bereiche gleich wahrscheinlich ausgewählt werden, dann werden Sie sehr verzerrte Ergebnisse sehen. –

+1

Ja, wenn die Verteilung wichtig ist (daher meine Aussage über die optionale Verwendung von Gewichten). Ich bin mir auch der Nachteile jeder Methode bewusst - ich fragte mich, ob es eine elegantere Lösung da draußen gibt :) – Goran

1

Es hängt davon ab, wie groß/groß die Ausschlussbereiche sind. Testen für unzulässigen Bereich (Ihre Option 1) würde für kleine Sätze funktionieren; keine Notwendigkeit, die Lösung zu einem einfachen Problem zu verkomplizieren. Lösung 3 würde für zahlreichere Ausschlusssätze besser funktionieren. Lösung 2 ist die meiste Arbeit, aber wahrscheinlich die korrekteste theoretische Lösung.

1

Ich benutze im Allgemeinen die Technik, die durch das zweite Geschoss beschrieben wird, vor allem, wenn die Menge der zulässigen Zahlen ziemlich klein ist. Aus statistischer Sicht ist es einfach, entweder die Zufälligkeit der Ergebnisse zu ruinieren oder die Ergebnisse von einer flachen Verteilung wegzuschneiden.

Es hat den zusätzlichen Vorteil, dass es ein einzelnes Picken erlaubt (wie das Austeilen von Karten oder Bingo Kugeln) ... Sie entfernen einfach die bereits ausgewählten Werte aus der Karte.

0

Es klingt, als könnte Ihr Algorithmus von einem leichten Redesign profitieren, bei dem die Zufallszahlen implizit erstellt werden, anstatt sie explizit mit einem Zufallsgenerator zu finden.

Zum Beispiel, wenn Sie eine zufällige Reihe der Zahlen von 1 bis 10 erhalten möchten, ist es besser, von einer geordneten Reihe zu beginnen, es auf irgendeine Weise zu mischen, zum Beispiel durch Austausch (es gab eine Frage darüber, denke ich) und nimm die Zahlen nacheinander.

1

Ordnen Sie sie den insgesamt erwarteten Bereichen zu. dann verteile sie zwischen den Bereichen.

z. Wenn Sie eine Zufallszahl zwischen 0..10 und 100..110 benötigen

Generieren Sie eine Zufallszahl zwischen 20. Die unteren 10 werden dem 0..10 Bereich zugewiesen, der Rest dem anderen Intervall (oder ähnlichem) Das - ich kann durch einen aus sein. Intervallarithmetik ist eine dieser Sachen, die ich nie beim ersten Versuch richtig bekomme).

Der Grund dafür ist, dass Sie oft mit nicht perfekten Zufallsgeneratoren umgehen.Diese beginnen sich merkwürdig zu verhalten, wenn Sie aufeinanderfolgende Zufallszahlenvariablen über mehrere Dimensionen verteilen (z. B. zuerst ein zufälliges Intervall auswählen und dann innerhalb des gewählten Intervalls eine Zufallszahl wählen). Das kann zu einem sehr offensichtlichen nicht zufälligen Verhalten führen.

Wenn Sie mit einem besseren Zufallszahlengenerator beginnen, der seine Daten aus echten zufälligen Quellen bezieht, können Sie am Ende wertvolle zufällige Bits verschwenden. Wenn Sie es nur einmal pro Sekunde tun, ist das möglicherweise kein Problem. Wenn Sie es zu oft tun, obwohl Sie Programm angehalten werden, weil die reinen zufälligen Quellen Ihren zufälligen Bitverbrauch einholen müssen.

+0

Off um eins in jedem der beiden Bereiche, fürchte ich (11 Werte im Bereich 0..10; ebenfalls 100 ..110). –

Verwandte Themen