Gerne würde ich in jedem Simulationsdurchlauf die gleichen Bernoulli Zahlen erstellen. Wenn ich alleridngs mit random_state= x als Argument
hinzufüge, wird schon innerhalb einer Simulation die gleiche Zufallszahl erstellt und das will ich nicht. Wie bekomme ich es in meinem Fall hin, dass innerhalb eines Simulationslaufs verschiedene Zufallszahlen erstellt werden und zur Überprüfbarkeit der Ergebnisse alle Simulationsläufe die gleichen Zahlen generieren. Hier der Code:
#Produkte
produkte = np.arange(12)
#Perioden
perioden = np.arange(10)
#number of runs
nRuns = 5
#Array q
q = np.array([ [0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9] ])
s = np.ones((nRuns,len(perioden),len(produkte)),dtype=np.int32)
for c in range(nRuns):
for t in perioden:
for j in produkte:
s[c, t, j] = bernoulli.rvs(q[t,j])
random_state für Zufallsvariable
@schuesra: Wenn du bei jedem `bernoulli.rvs`-Aufruf den selben Seed verwendest, dann ist es doch logisch, dass immer die selbe Zahl generiert wird, oder?
Du darfst den Seed nur einmal auf einen beliebigen Wert setzen.
Deinen Code kann man auch kürzer schreiben, indem man `bernoulli.rvs` gleich die richtige Shape mitgibt, in der die Zahlen generiert werden sollen. Generell gilt bei NumPy, dass selbst geschriebene Schleifen praktisch immer nicht der richtige Weg sind. Und `q` kann auch einfacher generiert werden als alle Zahlen manuell zu schreiben:
Oder möchtest du in `s` fünfmal die selben Zufallszahlen haben? Dann suchst du vielleicht `np.broadcast_to`:
Du darfst den Seed nur einmal auf einen beliebigen Wert setzen.
Deinen Code kann man auch kürzer schreiben, indem man `bernoulli.rvs` gleich die richtige Shape mitgibt, in der die Zahlen generiert werden sollen. Generell gilt bei NumPy, dass selbst geschriebene Schleifen praktisch immer nicht der richtige Weg sind. Und `q` kann auch einfacher generiert werden als alle Zahlen manuell zu schreiben:
Code: Alles auswählen
In [19]: paste
q = np.array([ [0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9],
[0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9] ])
## -- End pasted text --
In [21]: n_runs = 5
In [47]: s1 = bernoulli.rvs(q, size=(n_runs, *q.shape), random_state=42)
In [48]: s2 = bernoulli.rvs(q, size=(n_runs, *q.shape), random_state=42)
In [49]: (s1 == s2).all()
Out[49]: True
In [50]: s1.shape
Out[50]: (5, 10, 12)
In [58]: (q == np.array([[.7, .9] * 6] * 10)).all()
Out[58]: True
Code: Alles auswählen
In [122]: a
Out[122]:
array([[1, 2],
[3, 4]])
In [123]: np.broadcast_to(a, (5, *a.shape))
Out[123]:
array([[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]]])