Tester liczb pseudolosowych

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ł?

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.

0

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

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.

0

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

0

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

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ć?

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;
}
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;
}
1

Czy musicie sobie tak życie utrudniać?

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

Przecież napisałem?

0

Tak, dzięki. Tylko ja potrzebuję tego w C.
C++ w ogóle nie znam

Podbijam, wciąż się z tym męczę. Program musi być w C

0

No litości, wysłałem Ci gotowca i nie umiesz przepisać tego do c?

0

zaczęłam przygodę z C. z c++ nigdy nie miałam kontaktu niestety:(

1

To co podał @pingwindyktator tobie pasuje, jedynie masz zamienić:

  1. new - w komentarzach podano na co.
  2. cout - zamieniasz na printf, ze jeżeli masz IQ powyżej małpy to zrozumiesz co tam jest wyświetlane i dasz rady przerobić na printf.
0

123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890...

very fest random string... :)

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