Avatar billede trp79 Nybegynder
27. oktober 2002 - 20:35 Der er 25 kommentarer og
1 løsning

Random

Findes der i c (linux) en funktion der er mere random end "rand %" ? i så fald hvilken og hvordan er syntaks`?
Avatar billede arne_v Ekspert
27. oktober 2002 - 20:57 #1
Standard rand er sjældent særlig god.

Diverse Unix har suppleret den med andre
såsom random og rand48, der er lidt bedre.

Et hurtigt blik på min Redhat 7.2 viste at den
har random men ikke rand48.

Hvis du virkeligt vil have en seriøs random
generator så finder du en kendt algoritme
og implementere den selv.
Avatar billede trp79 Nybegynder
27. oktober 2002 - 20:59 #2
Okey det kunne godt være godt, men kan jeg finde en sådan algoritme?
Avatar billede arne_v Ekspert
27. oktober 2002 - 20:59 #3
F.eks. L'Ecuyer CMRG 1996 med en periode på
10^61.

Eller L'Ecuyer/Blouin/Coutre MRG  1993 med en
periode på 10^46.
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:01 #4
Giv mig lige 10 minutter så kan jeg kode MRG'en.
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:02 #5
Det lyder kanon godt!Hvad betyder 10^61 ? noget med hvor random den er?
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:02 #6
og hvad er MRG'eren?
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:04 #7
Lige en anden ting... hvor fand.. ved du alt det fra? Du har jo svaret på et hav af spørgsmål og ikke stillet et eneste selv!
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:05 #8
Periode er det antal tilfældige tal du kan generere
inden den begynder at gentage sig selv.

rand gentager sig selv efter ca. 2 milliarder kald.

10^61 er 10 opløftet til 61 eller et 1 efterfulgt
af 61 nuller. Hvilket er et allerhelvedes stort tal.

Hvis du kun skal generere 10 tilfældige tal betyder
det selvfølgelig ikke noget.
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:06 #9
MRG =  Multiple Rekursiv Generator

Jeg henviser mere præcist til L'Ecuyer/Blouin/Coutre MRG 1993.
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:08 #10
Og hvor jeg ved alt det fra.

Tja - jeg startede med at kode en masse i VAX assembler
i midten af 80'erne - og siden er det blevet til lidt
Fortran, Pascal, C, C++, Visual Basic, Java gennem
årene !
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:09 #11
Mit problem er at jeg hvis jeg har en server proces og kører 10 klien processor hvori jeg bruger rand % så udvælger klienterne det samme tal, hvis du forstår?
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:10 #12
Erfaring altså! Så er der håb for sådan nogen som os endnu der programmere på 2 år... ;o)
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:12 #13
Men så hjælper det jo selvfølgelig ikke at finde en mere random algoritme... men det kunne nu være sjovt at se en...
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:15 #14
Korrekt,

Ligger random generatoren i hver af de 10 klienter ?

Hvis ja, så skal du sikre dig at de kalder srand
med forskelligt argument ellers returnerer
rand naturligvis samme "tilfældige" tal.
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:17 #15
Jep, den ligger i hver af de 10 klienter...

Vælger srand ikke det samme tal hvergang?
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:20 #16
rand (og alle de øvrige genratorer) har en fast
række-følge af tal (med længde lig med den periode
jeg omtalte tidligere).

Når du kalder rand returnerer den det tal den
er kommet til og flytter sig til næste.

Når du kalder srand fortæller du den, hvor i
række-følgen den skal starte.

Så hvis alle 10 klinter kalder srand(123), så
vil rand i de 10 klienter returnere samme
værdi.

Hvis derimod de 10 klienter kalder med srand(101)
srand(102) etc., så vil du får forskellige tilfældige
tal.
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:22 #17
Men stadigvæk samme tal for hver kørsel.

Hvis du skal have det mere randomiseret, så
kan du prøve med noget i retning af:

#include <unistd.h>
#include <time.h>

srand(time(NULL)+getpid);

så vælger du start seed udfra både tid og process
ID, hvilket i de fleste tilfælde burde gøre det
meget "tilfældigt".
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:26 #18
Forrygende arne! Det sidste kan jeg i hvert fald drage nytte af :o) Jeg takker!
Avatar billede trp79 Nybegynder
27. oktober 2002 - 21:29 #19
lige en sidste ting... jeg undgå at skulle lave en while løkke for at indkredse srand(time(NULL)+getpid) til ikke at lave et tal der er større end fx 60?
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:30 #20
MRG (lidt hurtigt tastet ind, så jeg garanterer ikke
for korrektheden):

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

static unsigned long int seed[5];

void mysrand(unsigned long int ss[])
{
  seed[0]=ss[0];
  seed[1]=ss[1];
  seed[2]=ss[2];
  seed[3]=ss[3];
  seed[4]=ss[4];
  return;
}

unsigned long int myrand()
{
  unsigned long int res;
  int i;
  res=(107374182*seed[0]+104480*seed[4])%2147483647;
  seed[4]=seed[3];
  seed[3]=seed[2];
  seed[2]=seed[1];
  seed[1]=seed[0];
  seed[0]=res;
  return res;
}

int main(int argc,char *argv[])
{
  unsigned long int ss[5];
  int i;
  ss[0]=1234567;
  ss[1]=123;
  ss[2]=4444;
  ss[3]=987;
  ss[4]=12321;
  mysrand(ss);
  for(i=0;i<10;i++) {
      printf("%ld\n",myrand());
  }
  exit(0);
}
Avatar billede dittmer Nybegynder
27. oktober 2002 - 21:30 #21
Arne har nemmerlig fat i noget her. En "krydsning" af noget lineært (tiden - i hvert fald som den populært opfattes ;o) og noget cyklisk, nemlig proces-id. Dette vil i de fleste tilfælde være fint, og ellers kan man jo bare gå ud af en tangent med at finde på alskens underlige varianter af cykliske funktioner, trigonometriske funktioner, elliptiske, hyper-hvad-som-helst... men jeg har nu aldrig selv haft brug for noget i den stil...
Du kan evt. osse checke "Numerical Recipes" for inspiration - jeg mener, der er en generator deri, men jeg kan ikke på stående fod huske det...

Mvh
Søren
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:33 #22
Du kalder bare srand med hvad som helst.

rand returnerer et tal mellem 0 og RAND_MAX.

Du kan så konvertere det til en størrelse du
kan bruge med f.eks. %.

NB: Standard rand har en uheldig egenskab med
at returnere skiftes lige ulige, så %2 giver
ikke meget tilfældighed.
Avatar billede dittmer Nybegynder
27. oktober 2002 - 21:35 #23
Ork jo. "Numerical Recipes i C" og de andre sprog indeholder kapitel 7: Random Numbers. Godt 50 sider inkl. opgaver for den interesserede læser... Geniale bøger, synes jeg.
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:38 #24
Numerical Recipies har flere random generatorer.

Jeg kan faktisk ikke lide deres anbefalinger, da
de lider under den tro at kompleksitet gør
algoritmer bedre.
Avatar billede arne_v Ekspert
27. oktober 2002 - 21:40 #25
Der er iøvrigt er firma i USA som sælger en
ægte random generator:
  - en lava-lampe
  - et digital kamera som tager et billede
    af lampen
  - kode som læser dette billede i JPEG og
    udregner en hash sum af billedet

:-)
Avatar billede dittmer Nybegynder
27. oktober 2002 - 21:42 #26
ROTFL
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester