2016-05-09 4 views
0

Ich möchte 4 zufällige ganze Zahlen im Bereich [1,4] in einer einheitlichen Verteilung generieren. Zum Beispiel erscheint jede Nummer dreimal für eine Folge von 12 Elementen.Wie erzeuge ich eine Folge von ganzen Zahlen in einer gleichmäßigen Verteilung?

+10

Das wäre nicht zufällig:/ – linusg

+4

Wie definieren Sie "erscheinen eq urally "? Meinst du [einheitliche Verteilung] (https://en.wikipedia.org/wiki/Uniform_distribution_%28discrete%29)? – gdlmx

+0

@linusg das Problem ist wahrscheinlich, dass sie eine Sequenz beliebiger Länge erzeugen wollen, die Elemente in zufälliger Reihenfolge hat, in der jedes Element gleich wahrscheinlich erscheint. Ich habe etwas Ähnliches im A/B-Test verwendet: Ich brauchte einen festen Prozentsatz von Leuten während des gesamten Tests, um SMS A zu erhalten, aber der Gesamtpool der Testpersonen war variabel. Sie können meine Antwort für ein Beispiel sehen. Die Auswahl von SMS für eine Person wurde randomisiert. – roganjosh

Antwort

1

verwenden, können Sie einen Generator verwenden:

from random import randint 

def getNum1To4(runs): 
    occurences = {n+1:0 for n in range(4)} 
    for i in range(runs): 
     options = [n for n in occurences if occurences[n] < runs/4] 
     choice = options[randint(0, len(options) - 1)] 
     occurences[choice] += 1 
     yield choice 

Ausgänge:

>>> runs = 8 
>>> gen = getNum1To4(8) 
>>> for n in range(runs): print gen.next() 
2 
1 
3 
1 
3 
4 
4 
2 
0

Sie können Listen für diese Aufgabe verwenden, um sicherzustellen, dass Ihr Pool verfügbarer Nummern keine Duplikate enthält. Ich bin nicht sicher, ob Sie sie in Satzblöcken innerhalb der Liste von 12 oder ob Sie es vollständig randomisiert möchten. Wenn Ersteres, entferne den letzten Shuffle.

from random import shuffle 

choice_pool = [x for x in range(1, 5)] 
random_output = [] 
number_of_runs = 4 

for x in range(number_of_runs): 
    shuffle(choice_pool) 
    random_output += choice_pool 

shuffle(random_output) 
print random_output 
0

sollte dieser Ansatz funktionieren:

import random 

foo = [i for i in range(1, 5)] * 4 
print random.sample(foo, len(foo)) 

Ausgang: [2, 2, 3, 1, 4, 4, 3, 4, 1, 1, 3, 2, 1, 4, 3, 2]

0

Dies könnte Ihnen helfen -

import random 

def foo(number_of_runs, lower_limit, upper_limit): 
    turns = number_of_runs // (upper_limit - lower_limit + 1) 
    arr = list(range(lower_limit, upper_limit + 1)) * turns 
    random.shuffle(arr) 
    return arr 

print(foo(12, 1, 4)) 
0

Try this,

import random 
x = [i for i in range(1, 5)] * 3 
random.shuffle(x) # shuffle the sequence x in place 

# Output 
[4, 3, 1, 3, 2, 2, 3, 4, 4, 1, 2, 1] 

Wenn die Elemente float oder double sind, wäre die Antwort viel einfacher durch numpy.random.uniform

import numpy as np 
x = np.random.uniform(1, 5, 12) 

# Output 
array([ 4.18515267, 4.87403138, 3.43580119, 2.62828693, 3.77675348, 
     4.15627119, 4.02190688, 3.56667674, 1.31115154, 1.74971624, 
     3.20515834, 1.75240044]) 
Verwandte Themen