Posuvný register

Hod kockou


Program Spustiteľná verzia

/* pripojenie potrebných hlavičkových súborov */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

/* budeme používať 5-prvkový posuvný register */
#define N 5

typedef struct uzol {
	int x;
	struct uzol *dalsi;
} TUzol;

-----------------------------------------------------------------------------------
void vytvor_register(TUzol **z, TUzol **k)
{
	TUzol *pom;
	int i;

	printf("\nZadaj zaciatocne hodnoty xi z mnoziny {1, 2, 3, 4, 5, 6}\n");

	*z  = (TUzol*)malloc(sizeof(TUzol));
	printf("x0 = ");
	scanf("%d", &((*z)->x));
	(*z)->dalsi = NULL;
	*k = *z;

	for (i = 2; i <= N; i++) {
		pom = (TUzol*)malloc(sizeof(TUzol));
		if (i < N) {
			printf("x%d = ", i - 1);
			scanf("%d", &(pom->x));
		}

		(*k)->dalsi = pom;
		pom->dalsi = NULL;
		*k = pom;
	}
}
-----------------------------------------------------------------------------------
void posun_vlavo(TUzol **z, TUzol **k)
{
	TUzol *pom;

	pom = *z;
	*z = (*z)->dalsi;
	free((void*)pom);

	pom = (TUzol*)malloc(sizeof(TUzol));
	(*k)->dalsi = pom;
	pom->dalsi = NULL;
	*k = pom;
}
-----------------------------------------------------------------------------------
int nove_x(TUzol *z)  /* rekurentný vzťah */
{
	int x = 7 * z->x + z->dalsi->dalsi->dalsi->x + 991;
	return ((x % 6) + 1);
}
-----------------------------------------------------------------------------------
void main(void) /* hlavný program */
{
	TUzol *zac, *kon;
	int pocetnost[6] = {0, 0 , 0, 0, 0, 0};
	long PocetPokusov, i;

	zac = kon = NULL;

	clrscr();
	printf("Hod hracou kockou – generator pseudonahodnych cisel\n\n");
	printf("x4 = f(x0, x1, x2, x3)\n\n");
	printf("Pocet pokusov: ");
	scanf("%ld", &PocetPokusov);
	vytvor_register(&zac, &kon);
	clrscr();

	/* prvý pokus */
	kon->x = nove_x(zac);
	printf("%d", kon->x);
	pocetnost[kon->x - 1]++;

	/* ostatné pokusy */
	for (i = 2; i <= PocetPokusov; i++) {
		posun_vlavo(&zac, &kon);
		kon->x = nove_x(zac);
		printf("%d", kon->x);
		pocetnost[kon->x - 1]++;
	}

	/* výstup */
	printf("\n\nRelativne pocetnosti nahodnych udalosti:\n\n");
	for (i = 0; i<6; i++) {
		printf("Padnutie cisla %ld ...... %8.4f %%\n", i+1, 100*(float)pocetnost[i]/PocetPokusov);
	}
	getch();
}