Tester liczb pseudolosowych

Odpowiedz Nowy wątek
2013-12-27 22:59
Kaja
0

Mam do zrobienia program, który testuje losowość liczb w c. Najpierw generuje dużą liczbę pseudolosowych liczb - potem je testuje.
Zrobiłam program generujący dużą ilość liczb:

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int i=0;

   srand(4);   

   for(i=0;i<100000;i++)
   {
      printf("%i\n",rand());
   }
return 0;
} 

Chciałabym teraz zapisać pojedyncze liczby i utworzyć wykres powtarzalności. Czy to dobry pomysł?

Aw jaki sposób chciałbyś zrobić wykres powtarzalności. - tomi0001 2013-12-27 23:04

Pozostało 580 znaków

2013-12-28 02:17
0

Nie widze w tym sensu...
No ale popraw

srand(4);

na

srand(time(0));

EDIT:
http://ideone.com/gAeHl2
Tak jak przypuszczałem, to raczej nie ma sensu.


edytowany 1x, ostatnio: pingwindyktator, 2013-12-28 03:21
wtedy wyniki nie będą powtarzalne - krwq 2013-12-28 03:09
on testuje liczby pseudolosowwei watpie zeby chcial za kazdym razem inny zestaw liczb losowac - krwq 2013-12-28 03:16
Wiec mówimy o losowości, czy nie? - pingwindyktator 2013-12-28 03:16
Ja bym zaczął od zestawu własnych liczb, celem upewnienia się że losowe będzie tylko wejście, a wyjście już nie. - sig 2013-12-28 07:05

Pozostało 580 znaków

2013-12-28 09:15
kaja
0

Ok, dzieki za odpowiedź.
JAk zrobić tester liczb losowych aby miał sens? Nie mam na to żadnego pomysłu

Pozostało 580 znaków

2013-12-28 09:40
2

Po prostu sprawdzasz czy statystyka wylosowanych liczb jest zgodna z oczekiwaniami.
Np losujesz bardzo dużo liczb i sprawdzasz czy są rozłożone w miarę jednolicie.
Najlepiej liczyć jakieś parametry statystyczne tych próbek (może posłużyć się histogramami, ale są trudne w analizie numerycznej).
Najprościej policzyć kolejne wariancję:

var(x) ,  var(x<sup>2) ,  var(x</sup>3) ,  var(x^4)

i sprawdzić czy są zgodnie z wartościami oczekiwanymi w ustalonych granicach (na ten zakres też jest wzór).

To jednak nie wystarczy, ważne jest też, by kolejne wartości też były niezależne, więc równocześnie trzeba policzyć wariancję:

var(x_{i+1}\cdot x_{i}) var(x_{i+1} - x_{i})

Te wartości również powinny mieścić się w pewnych ściśle określonych granicach.

Statystyką nie zajmowałem się już dość długo, więc sam spróbuj policzyć jakie powinny być tam wartości i z jaką dokładnością (nie powinno to być bardzo trudne). Możesz też poszukać w książkach gotowych wzorów.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2013-12-28 10:41

Pozostało 580 znaków

2013-12-28 12:07
Kaja
0

Dziękuję za odpowiedź.
Postanowiłam zbadać losowość histogramem.
Mogłabym prosić o nakierowanie/linki do artykułów w tym temacie?

Pozostało 580 znaków

2013-12-28 12:47
0

R do statystyki oraz testy Diehard (Szklanej Pułapki?).

Pozostało 580 znaków

2013-12-29 20:26
Kaja
0

JA bym chciała, żeby wygenerowane losówki zapisać w tablicy, potem je pobrać i stworzyć histogra wystąpienia każdej liczby z np 100tys danych. Tak, żeby wyglądało to mniej więcej tak:
0 ( 50):*
1 ( 59):*****

2 ( 42):*
3 ( 49):****
4 ( 41):**
5 ( 53):****
6 ( 60):**
7 ( 47):*****

8 ( 54):*****
9 ( 45):*

Jak to zrobić?

Pozostało 580 znaków

2013-12-29 20:31
2

Przechowuj sobie liczbe tych gwiazdek.

#include <iostream>
#include <stdlib.h>
#include <ctime>
typedef unsigned long long int type;
using namespace std;
const size_t MAX = 10;

int main()
{
  srand(time(NULL));
  type *T = new type [MAX] {};
  const type R = 100;
  for(type i = 0; i < R; ++i)
    ++T[rand()%MAX];

  for(type i = 0; i < MAX; ++i)
  {
    cout<<i<<" ("<<T[i]<<')'<<":\t";
    while(T[i]--)
      cout<<'*';
    cout<<endl;
  }
  return 0;
}

edytowany 2x, ostatnio: pingwindyktator, 2013-12-29 21:14
Pokaż pozostałe 4 komentarze
Zależy jaki system, size_t to akurat dopasowany do rozmiarów tablic typ. - _13th_Dragon 2013-12-29 20:54
U mnie to unsigned int, ale kiedy testów R jest dużo, a MAX mało, to sie nie pomiesci w tym typie, wiec wolałem zrobic jako unsigned long long. - pingwindyktator 2013-12-29 20:57
Jeżeli to się nie mieści w size_t to nie da rady przydzielić tyle pamięci. - _13th_Dragon 2013-12-29 20:58
No i oczywiscie wypadałoby dorzucic tutaj jakies zabezpieczenie przed zbyt małą iloscią pamięci. - pingwindyktator 2013-12-29 20:58
const size_t MAX=10; static type T[MAX]={}; - i po kłopocie. Nie skompiluje się jeżeli za dużo wymagamy. - _13th_Dragon 2013-12-29 21:03

Pozostało 580 znaków

2013-12-29 21:04
Kaja
0

Mam coś takiego:

Program generuje daną ilosć liczb losowych, a potem liczy ilosć wystąpień każdej. Jak to zmienić na gwiazdkowy histogram?

 #include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define SIZE 100

int main()
{
    int numer_uruchomien;
    int numer;
    int i;
    int most;
    int least;
    int count[SIZE] = {0};

    srand(time(NULL));

    printf("Jak duzo liczb mam wygenerowac? ");
    scanf("%d", &numer_uruchomien);

    while (numer_uruchomien > 0)
    {
        number = rand()%SIZE;
        count[numer] = count[numer] + 1;
        numer_uruchomien--;
    }

    for (i = 0; i < SIZE; i++)
    {
        printf("%d wystapila %d razy\n", i+1, count[i]);
    }

    most = 0;
    least = 0;
    for (i = 0; i < SIZE; i++)
    {
        if (count[i] > count[most])
        {
            most = i;
        }
        if (count[i] < count[least])
        {
            least = i;
        }
    }
    printf("%d najwiecej %d razy\n", most+1, count[most]);
    printf("%d najmniej %d razy\n", least+1, count[least]);
    return 0;
}

Pozostało 580 znaków

2013-12-29 21:13
1

Czy musicie sobie tak życie utrudniać?

scanf("%d", &numer_uruchomien);
while(numer_uruchomien--) ++count[rand()%SIZE];

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-12-29 21:14
1

Przecież napisałem?


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0