From 50dda836f33a45ca7ab9d053cf98b49cd68092a3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Micha=C5=82=20Bartoszkiewicz?= Date: Tue, 22 Dec 2009 00:49:13 +0100 Subject: [PATCH] =?utf8?q?Je=C5=9Bli=20mo=C5=BCna,=20u=C5=BCywamy=20ziarna?= =?utf8?q?=20z=20/dev/urandom.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Ziarno generowane przy pomocy time() zmienia się tylko raz na sekundę, przez co wszystkie choinki generowane w tej samej sekundzie wyglądały identycznie. Jeżeli nie uda się użyć ziarna z /dev/urandom używamy ziarna z time(). --- choinka.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/choinka.c b/choinka.c index 1e29614..b10f073 100644 --- a/choinka.c +++ b/choinka.c @@ -24,6 +24,23 @@ atrybut const podstawa = {0, COLOR_YELLOW}; atrybut const podpis = {A_BOLD, COLOR_RED}; atrybut const gwiazdka = {A_BOLD, COLOR_YELLOW}; +void inicjuj_rng() +{ + unsigned ziarno = 0; + FILE* f = fopen("/dev/urandom", "rb"); + if (f != NULL) { + unsigned nowe_ziarno; + if (fread(&nowe_ziarno, sizeof nowe_ziarno, 1, f) == 1) { + ziarno = nowe_ziarno; + } + fclose(f); + } + if (ziarno == 0) { + ziarno = time(NULL); + } + srand(ziarno); +} + char const rysunek[] = " *\n" " /.\\\n" @@ -50,7 +67,7 @@ void ustaw(atrybut const* attr) int main() { - srand(time(NULL)); + inicjuj_rng(); setupterm(NULL, 1, NULL); atrybut const* kolor = &choinka; for (int i = 0; rysunek[i] != '\0'; i++) { -- 2.43.2