TlačiťTlačiť Slovenčina English Hľadať RSS

© 2005 – 2024 Roman Horváth, všetky práva vyhradené. Dnes je 2. 5. 2024.

Stránka sa načítava, prosím čakajte…

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();
	}
}

  
obrázok 
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. 
 

~

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.

  
obrázok 
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.