τυχαιοι αριθμοι

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
Άβαταρ μέλους
Kesmarag
Δημοσιεύσεις: 495
Εγγραφή: 13 Ιαν 2006 10:13
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

τυχαιοι αριθμοι

Δημοσίευση από Kesmarag » 14 Νοέμ 2007 22:06

θελω να φτιαξω ενα προγραμμα στη C στο οποιο χρειαζομαι να παραγει τυχαιους αριθμους.Υπαρχει καποια συναρτηση η πρεπει να κατασκευασω?

Άβαταρ μέλους
ALKIVIADES
Honorary Member
Δημοσιεύσεις: 1322
Εγγραφή: 07 Απρ 2005 03:39

τυχαιοι αριθμοι

Δημοσίευση από ALKIVIADES » 14 Νοέμ 2007 23:31

..εάν εννοούμε δε pseudo-random rand() / srand() ,

τότες δες εδώ καθώς και ένα-δύο παράδειγματα με χρήση αυτώνε :

Κώδικας: Επιλογή όλων

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

int main&#40;int argc, char *argv&#91;&#93;&#41;
 
&#123; 
  
  printf&#40; "%d\n", rand&#40;&#41;&#41;; 
  printf&#40; "%d\n", rand&#40;&#41;&#41;; 
  printf&#40; "%d\n", rand&#40;&#41;&#41;; 

  system&#40;"PAUSE"&#41;;	
  return 0;

&#125;

Κώδικας: Επιλογή όλων

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

int main&#40;int argc, char *argv&#91;&#93;&#41;

&#123;
  int i;
  int n=3;
  unsigned int fourthdimention = time&#40;0&#41;;
  
  srand &#40;fourthdimention&#41;;

  for &#40;i=0; i<n; i++&#41;
  
  &#123;
    printf &#40;"%d %d\n",i, rand &#40;&#41;&#41;;
  &#125;
  
  system&#40;"PAUSE"&#41;;	
  return 0;
  
&#125;
Εικόνα

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

τυχαιοι αριθμοι

Δημοσίευση από soteres2002 » 15 Νοέμ 2007 14:19

Αν σε ενδιαφέρει περισσότερο ή θέλεις να κάνεις περισσότερα με τους ψευδοτυχαίους αριθμούς ασχολήσου με την γεννήτρια παραγωγής ψευδοτυχαίων Fast Mersenne Twister. Δες αυτό εδώ το λίνκ http://www.math.sci.hiroshima-u.ac.jp/~ ... T/emt.html . Υπάρχει έκδοση του αλγορίθμου σε γλώσσα C και παραδειγματικός κώδικας που παρουσιάζει όλες τις λειτουργίες της γλώσσας. Ο αλγόριθμος αυτός υπάρχει και στο PHP core, και είναι ορατός από την επέκταση standard μέσω των συναρτήσεων mt_* .

Υπάρχει τρόπος να παράγεις και "πραγματικά τυχαίους αριθμούς". αυτό γίνεται μέσω πολύπλοκων μαθηματικών συναρτήσεων (πχ Φουριέ μετασχηματισμούς) που εξομοιώνουν την φυσική διαδικασία παραγωγής τυχαίων αριθμών. Υπάρχει βιβλίο που ασχολείται με τα μαθηματικά της παραγωγής ψευοτυχαίων αριθμών και με σχετικούς αλγόριθμους. Αυτό θα ήταν χρήσιμο αν γράφεις τυχερά παιχνίδια, στα οποία χρειάζονται τυχαίοι αριθμοί και όχι ψευδοτυχαίοι. Η rand() συνάρτηση της C είναι πολύ αναποτελεσματική, διότι πρέπει να ξέρεις πώς δουλεύει παρά να την καλέις απλά. πχ υπάρχουν προβλήματα με την κατανομή των αριθμών που που παράγονται σε ένα κλειστό διάστημα (πχ αν έκανες μια εφαρμογή με ζάρια).

Άβαταρ μέλους
Kesmarag
Δημοσιεύσεις: 495
Εγγραφή: 13 Ιαν 2006 10:13
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

τυχαιοι αριθμοι

Δημοσίευση από Kesmarag » 16 Νοέμ 2007 00:41

Ευχαριστω για τισ απαντησεις.Θελω πραγματικα τυχαιους αφου θελω να φτιαξω προγραμμα γενετικων αλγοριθμων και δεν θελω καθε φορα που τρεχει με τις ιδιες παραμετρους να βγαζει τα ιδια αποτελεσματα.

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

τυχαιοι αριθμοι

Δημοσίευση από nirvana » 19 Μάιος 2008 18:35

Ξεθαψα το θεμα για να μην ανοιγω καινουργιο χωρις λογο...
Προσπαθω να δημιουργησω τυχαιους αριθμους απο το 1 εως το 100 το οποιο σε γενικες γραμμες πετυχαινει.. Ο κωδικας ειναι ο εξης:

Κώδικας: Επιλογή όλων

int pseudonumbergenerator&#40;void&#41;&#123;
	srand&#40;time&#40;NULL&#41; + getpid&#40;&#41;&#41;;
	int k=rand&#40;&#41;;
	k=k%100;	// to k pairnei pseudotyxaia times apo to 0 ews to 99
        if &#40;k<50&#41;&#123;
            return 0;
        &#125;
        else&#123;
            return 1;
        &#125;
&#125;
int main&#40;int args, char *argv&#91;&#93;&#41;&#123;
   // code
   // ...
   // code

   int tralala=pseudonumbergenerator&#40;&#41;;
   while&#40;tralala == 1&#41;&#123;
          // code
          tralala=pseudonumbergenerator&#40;&#41;;
   &#125;
&#125;
Το προβλημα πιο ειναι; Γενικα πετυχαινει στο να δεινει τυχαιους (ψευδοτυχαιους) αριθμους. Παρολα αυτα η τυχαιοτητα εξαρταται απο τον χρονο. Εχοντας το μεσα στο while (φανταζομαι εγω τωρα :P) εκτελουνται τοσο γρηγορα τα διαδοχικα pseudonumbergenerator() που πρακτικα δεν αλλαζει ο χρονος και δινει τον ιδιο τυχαιο αριθμο(!). π.χ εκτελειται για πρωτη φορα και το pseudonumbergenerator δινει εστω κ=60 δηλαδη tralala=1. Αρχιζει το while και για 40 loop θα δινει παλι κ=60. Μετα θα αλλαζει και θα δωσει κατι αλλο. Ξερει κανεις καποιο τροπο να λυσω αυτο το θέμα? :-?

Ευχαριστω :)

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

τυχαιοι αριθμοι

Δημοσίευση από nirvana » 19 Μάιος 2008 19:10

Βασικα ψιλοελυσα το προβλημα μου κανοντας καποιες τυχαιες πραξεις καθε φορα και προσθετω το αποτελεσμα στο srand. Απλα η αληθεια ειναι οτι νιωθω πως δεν ειναι πολυ σωστη τεχνική..

Αν καποιος εχει καμια αλλη λυση...

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

τυχαιοι αριθμοι

Δημοσίευση από dva_dev » 19 Μάιος 2008 21:30

Τη srand το καλείς μία φορά στον πρόγραμμα σου, όταν αρχίζει, μετά καλείς μόνο τη rand.

Άβαταρ μέλους
nirvana
Δημοσιεύσεις: 241
Εγγραφή: 01 Σεπ 2005 18:28
Τοποθεσία: Αγ. Παρασκευή

τυχαιοι αριθμοι

Δημοσίευση από nirvana » 20 Μάιος 2008 11:21

Σωστός! Την έβγαλα απ' την ρουτινα και επαιξε.. Thanks :D

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες