2015-06-10 6 views

Antwort

4

Sie müssen angeben, was die gewünschte Verteilung der Zufallszahlen ist.

Wenn es keine weiteren Anforderungen sind, würde ich eine der folgenden Möglichkeiten vorschlagen:


(1)

  • wählen Zufallszahl eine [1] in Intervall 0 .. k
  • Auswahl Zufallszahl a [2] im Intervall 0 ..ka [1]
  • Pick Zufallszahl a [3] in Intervall 0 .. ka [1] -a [2]
  • ...
  • Pick Zufallszahl a [n] in Intervall 0 .. ka [1] -a [2] -...- a [n-1]

Wenn Sie m auf den Bereich von der Zufallszahl-Obergrenze haben, Verwende min (ka [1] -... m) als obere Grenze des Intervalls.

Nachteile: Sie werden viele kleine Zahlen und nur ein paar große bekommen.


(2)

  • Pick n Zufallszahlen a [1], .., a [n] in Intervall 0 .. m, m wobei die Obergrenze
  • s = a [1] + a [2] + ... + a [n]
  • multiplizieren jeweils a [i] von k/s (wenn ganzen Zahlen erforderlich sind, abrunden)

Nachteile: Es ist unwahrscheinlich, große Zahlen auf diese Weise zu erhalten. Wenn Ganzzahlen erforderlich sind, wird wahrscheinlich eine Lücke zwischen der Summe der Zahlen und k aufgrund von Rundungsfehler sein.


Ich glaube, Sie „schöner“ Zahlen mit Option erhalten (2), aber wie oben erwähnt, hängt es von den Anforderungen.

1

Es ist einfach, eine Nummer innerhalb des Bereichs [0, 255] zu erstellen.

Es ist leicht zu erkennen, ob k > 255*n oder k < 0 keine Lösung gibt.

Wenn 0 <= k <= 255*n, die Lösung existiert. Hier reden wir nur über n > 1 Zustand.

Sie n-1 Zufallszahlen erzeugt haben, und die Summe der n-1 Zahlen s1 an, dass die n-te Zahl x ist. Also s1 + x = k, und x sollte [0, 255] sein. Wenn die n-1 Nummern alle innerhalb des Bereichs [0, a] sind, dann (n-1)*a + 255 >= k, erhalten wir a >= (k-255)/(n-1).

Wenn k > 255, lassen Sie einfach a = (k-255)/(n-1). Es bedeutet s1 ist [0, k-255]. Dann kann die n-te Nummer x eine beliebige Zahl innerhalb [0, 255] sein. Also die Lösung ist willkürlich wählen Sie n-1 Zahlen innerhalb von [0, (k-255)/(n-1)] (Sie wissen (k-255)/(n-1) <= 255, damit es Ihren Zustand erfüllt), und wählen Sie eine zufällige Zahl innerhalb [0, 255].

Wenn k <= 255, willkürliche wählen n Zahlen jeweils innerhalb [0, k/n] (Sie wissen k/n innerhalb [0, 255]).

+0

Problem mit dieser Methode ist, wenn '-s1 <0' und/oder' k - s1> 255'. – pmg

+0

Aber ich brauche alle Zahlen innerhalb 0x00-0xFF .... jemand war schneller ;-) – Moeder

+0

@pmg Bitte sehen Sie meine aktualisierte Antwort. – coderz

3

Angenommen, k ist kleiner als 255 * n ist eine Lösung, jedem Element des Arrays k/n zuzuweisen, dann einen Wert zufällig zu den Array-Elementen subtrahieren.

// for (int i = 0; i < n; i++) array[i] = k/n; 
// for (int i = 0; i < n; i++) array[i] -= randbetween(0, array[i]); 
for (int i = 0; i < n; i++) array[i] = randbetween(0, k/n); 

Dies hat eine erwartete Summe von k/2. Durch Anpassen der randbetween() Funktion können Sie die Wahrscheinlichkeit der resultierenden Array-Summe ändern.

Verwandte Themen