2016-04-17 10 views
0

Ich habe ein dynamisches Array und eine ganze Zahl, die eine Wert 3 mal Arraylänge hat, dieRandomly in dynamischer Arrays der Verteilung von

Integer = array.length*3

Zum Beispiel ist, wenn das Array 4 Zellen dann der ganzen Zahlen Wert ist 12 und die Verteilung kann [8] [1] [2] [1], [5] [3] [0] [4], [0] [12] [0] [0] sein.

Wie kann ich den Integer-Wert zwischen den einzelnen Zellen des Arrays verteilen?

+2

Sie müssen [ask] lesen – Amit

+0

Willst du sagen, dass die Summe der Zellen gleich der ganzen Zahl sein muss? Weil du das nie gesagt hast. – pjs

Antwort

0

Vorausgesetzt, dass Sie ein Student sind, und das riecht wie Hausaufgaben, werde ich Ihnen zeigen eine stark kommentierte Version ich es in einer anderen Sprache (Rubin) implementiert und lassen Sie es in Java übersetzen für sich.

# Method to populate an array with values that sum to 3 * the array length 
def populate(array) 
    total = 3 * array.length # determine the value to sum to 
    # the following allocates a temporary array with one more element 
    # than the input array, and populates it with random integers 
    # between zero and total, inclusive 
    tmp = Array.new(array.length + 1) { rand(total + 1) } 
    # replace the first entry with zero, the last with total. 
    # in reality, any two entries could be used, but values of 
    # zero and total are critical to the algorithm 
    tmp[0] = 0 
    tmp[-1] = total 
    # sort the temp array into ascending order 
    tmp.sort! 
    # since the smallest entry in tmp is zero, and the largest is total, 
    # and the array is in ascending order, successive differences between 
    # tmp entries will sum to total 
    array.each_index { |i| array[i] = tmp[i + 1] - tmp[i] } 
    # return the resulting array 
    return array 
end 

Wenn er gestartet wird, erzeugt diese Ergebnisse wie

[0, 0, 4, 8] 
[3, 4, 0, 5] 
[2, 1, 6, 3] 

usw.

Der zugrunde liegende Algorithmus — n+1 Werte, die aus 0, total und n-1 Zufallswerte im Bereich erzeugen [0 , total], sortieren und finden die n aufeinanderfolgenden Unterschiede — ist einfach in jeder Sprache zu implementieren e.

1
Random r = new Random(); 
int max = array.length * 3; 
for(int i = 0; i < max; i++) { 
    array[r.nextInt(array.length)] += 1; 
} 
+0

Ja, das ist definitiv nicht perfekt, aber es wird auch nicht funktionieren. – Voo

+0

Ich muss es nicht testen, um zu sehen, dass die Verteilung offensichtlich zu den ersten Einträgen völlig verzerrt sein wird. Die Mathematik, wie dies verzerrt ist, ist interessanter, aber wenn Sie nur sehen wollen, dass es gebrochen ist, versuchen Sie es auf einem Array mit höheren Dimensionen. – Voo

+0

Nun, in diesem Fall würde ich einfach mit 'arr [0] = max' gehen. Wie das alte Sprichwort sagt, wenn es nicht korrekt sein muss, kann ich es beliebig schnell machen. Und nein, Sie haben die gleiche Voreingenommenheit für etwas über 2 Array-Einträge - Menschen sind einfach nicht besonders gut darin, solche Dinge zu bemerken, jeder statistische Test zeigt die Anomalie sogar für n = 4. – Voo