Stránka sa načítava, prosím čakajte…
© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 2. 5. 2024.
Dátum: 12. 8. 2021, pred tromi rokmi
Nasledujúci kód simuluje hod šiestimi kockami, sčítava hodnoty, ktoré na kockách padli a následne zobrazí histogram hodnôt z 10 000 vrhov. Simulácia sa dá zopakovať kliknutím na plochu.
~
import knižnica.*; public class Kocky extends GRobot { private int[] histogram = new int[31]; private int hodnôtMimo = 0; private int šírkaStĺpcovGrafu = 25; private int medzeraStĺpcovGrafu = 5; private int posunutieGrafuZľava = 30; private int posunutieGrafuZdola = 30; private double mierka = 0.5; private Kocky() { Svet.zbaľ(); hrúbkaČiary(šírkaStĺpcovGrafu - medzeraStĺpcovGrafu); skry(); klik(); } private void kresliGraf() { for (int i = 0; i < histogram.length; ++i) { skočNa( Svet.najmenšieX() + posunutieGrafuZľava + i * šírkaStĺpcovGrafu, Svet.najmenšieY() + posunutieGrafuZdola); vpred(histogram[i] * mierka); } if (0 != hodnôtMimo) { skočNa( Svet.najmenšieX() + posunutieGrafuZľava + histogram.length * šírkaStĺpcovGrafu, Svet.najmenšieY() + posunutieGrafuZdola); Farba f = farba(); farba(červená); vpred(hodnôtMimo * mierka); farba(f); } } @Override public void klik() { Svet.nekresli(); Svet.vymaž(); for (int i = 0; i < histogram.length; ++i) histogram[i] = 0; for (int i = 0; i < 10000; ++i) { int kocky[] = new int[6]; for (int j = 0; j < kocky.length; ++j) kocky[j] = (int)Svet.náhodnéCeléČíslo(0, 5); int číslo = 0; for (int j = 0; j < kocky.length; ++j) číslo += kocky[j]; if (číslo < 0 || číslo >= histogram.length) ++hodnôtMimo; else ++histogram[číslo]; } kresliGraf(); Svet.kresli(); } public static void main(String[] args) { Svet.použiKonfiguráciu("Kocky.cfg"); new Kocky(); } }
Ukážka jedného z možných výsledkov. Jednotlivé výsledky sa dramaticky nelíšia.
Ide o tzv. normálne rozdelenie (alebo rozloženie) pravdepodobnosti.
- Projekt Lazarusa – Kocky 60,50 kB (59,08 KiB), 12. 8. 2021
~
unit Dices; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs; type { TForm1 } TForm1 = class(TForm) procedure FormClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); private procedure Bar(BX: integer; BY: integer; BWidth: integer; BHeight: integer; BColor: TColor); public end; var Form1: TForm1; Data: array [0 .. 31] of integer; implementation {$R *.lfm} { TForm1 } procedure TForm1.Bar(BX: integer; BY: integer; BWidth: integer; BHeight: integer; BColor: TColor); begin with Canvas do begin Brush.Color := BColor; Rectangle(BX, BY, BX + BWidth, BY + BHeight); end; end; procedure TForm1.FormClick(Sender: TObject); begin FormCreate(Sender); Invalidate; end; procedure TForm1.FormCreate(Sender: TObject); var i, j, number: integer; Dices: array [0 .. 5] of integer; begin for i := 0 to 31 do Data[i] := 0; for i := 1 to 10000 do begin for j := 0 to 5 do Dices[j] := integer(random(6)); number := 0; for j := 0 to 5 do number := number + Dices[j]; if (number >= 0) and (number <= 31) then inc(Data[number]); end; end; procedure TForm1.FormPaint(Sender: TObject); const leftGap = 4.0; rightGap = 4.0; topGap = 8.0; bottomGap = 0.0; var i: integer; cx1, cx2, dx, dy: real; scale: real = 0.11; begin with Canvas do begin Brush.Color := clWhite; Rectangle(10, 10, self.Width - 10, self.Height - 10); cx1 := 10.0 + leftGap; dx := (self.Width - 20.0 - leftGap - rightGap) / 32.0; cx2 := cx1 + dx; dy := (self.Height - 20.0 - topGap - bottomGap) / 100.0; for i := 0 to 31 do begin Bar( round(cx1 + leftGap), round(self.Height - 10 - bottomGap), round(cx2 - cx1 - leftGap - rightGap), round(-dy * scale * Data[i]), clRed); cx1 := cx1 + dx; cx2 := cx2 + dx; end; end; end; end.
Ukážka jedného z možných výsledkov. Jednotlivé výsledky sa dramaticky nelíšia.
Ide o tzv. normálne rozdelenie (alebo rozloženie) pravdepodobnosti.
Prosím, zvoľte kartu s programovacím jazykom.