Ich schreibe grade ein kleines Programm zur Berechnung von einem Würfelwurf. Die Berechnung die ich vektorisieren möchte ist die nachfolgende for-Schleife:
Code:
%% Create n rolls of 2D6 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n = 400000; %number of rolls
nDice = 3; %n dice thrown, e.g.3
sDice = 6; %number of dice sides e.g.6
Rolls = randi(sDice,nDice,n); %calculation of uniformly distributed pseudorandom integers
ifsize(Rolls,1) < 2
Chance = 0; %kein Pasch mit einem Würfel möglich
elseifsize(Rolls,1) == 2
Chance = sum(eq(Rolls(1,:),Rolls(2,:))) / size(Rolls,2); %Berechnung für 2 Würfel
else
pasch = zeros(6,size(Rolls,2)); %Berechnung mehr als 2 Wüefel
for k=1:6
pasch(k,:) = sum(eq(Rolls,ones(size(Rolls)).*k));
end
paschChance = length(pasch(pasch>=2))/size(Rolls,2);
end
Kurz zu dem Prgoramm, ich generiere mir einen Satz gleichverteiler Zufallszahlen mit 3 Würfel und 40000 Würfen. Mit den If Abfragen überprüfe ich die Anzahl der benutzten Würfel. Mit einem Würfel kein Pasch möglich mit 2 Würfel vergleiche ich einfach die beiden Vektoren. Interessant wird es jetzt für mehr als drei Würfel und das ist auch mein Problem diese Berechnung nur mit Matrixoperationen durchzuführen. Was ich mir ausgedacht habe :
Ich erstelle mir eine Einheitsmatrix mit den gleichen Dimensionen wie meine Würfelergebnisse und vergleiche diese miteinander. Daraus erhalte ich eine logische Matrix mit Nullen und Einsen. Diese Summiere ich dann spaltenweise auf. Ist das Ergebniss größer gleich 2 dann habe ich zwei Einser in dem Wurf gehabt und somit einen Pasch. Für die anderen Fälle multiplizier ich die Einheitsmatrix mit k von 2 bis 6.
Hoffe die Erklärung ist ausführlich genung, falls noch fragen sind einfach stellen.
Die Frage ist, wie du die Anzahl der Pasch bei mehr als 3 Würfeln zählen möchtest. Es können ja z.B bei 4 Würfeln jeweils zwei die gleiche Augenzahl besitzen. D.h. in diesem Fall würden bei deiner Version in einem Wurf 2 Pasch gezählt, was bedeutet, dass du auf eine Wahrscheinlichkeit von über 100% kommen kannst. Meine vorgeschlagenen Version wäre momentan auf das Intervall [0;1] beschränkt.
@Jan
Die Berechnung in der Else Bedingung möchte ich vektorisieren, diese braucht im Vergleich zu den anderen Berechnungen 10mal länger. Ich dachte dass die beiden anderen Berechnungen gut ausgeführt sind. Falls nicht korrigier mich einfach .
Code:
else
pasch = zeros(6,size(Rolls,2)); %Berechnung mehr als 2 Wüefel
for k=1:6
pasch(k,:) = sum(Rolls == k);
end
paschChance = length(pasch(pasch>=2))/size(Rolls,2);
end
@soad
Danke für deinen Einwand, da geb ich dir recht die Logik ist noch nicht richtig. Wenn ich jetzt dieses Würfelergebnis bekomme mit 4 Würfeln und 3 Würfe:
Dann möchte ich in der ersten Spalte 2 Päsche zählen in der zweiten Spalte 2 Päsche und in der dritten Spalte einen Pasch. Am Ende summiere ich die Anzahl so dass ich in dem Beispiel auf 5 geworfene Päsche komme. Es ist erstmal egal wie oft ein 1er Pasch bzw. 2er Pasch geworfen worden ist. Wobei das ein netter Bonus wäre das nich zu wissen.
Danke für die schnelle Hilfe. Mit Befehl bekomm ich das glaube ich vollens hin.
Grüße
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.