Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Το I/O είναι μακράν η πιο χρονοβόρα διαδικασία οποιουδήποτε προγράμματος (αποτελεί και βασική αιτία που εξαιρείται ή θεωρείται σταθερά στην ανάλυση αλγορίθμων).

 

@Starlight:

 

Το συγκεκριμένο δεν είναι bug, έτσι κατάλαβα πως ήθελες να λειτουργεί ο κώδικας. Αν θες να ρωτάει μετά από κάθε roll, απλώς βγάλε έξω από το else τη γραμμή που κάνει την ερώτηση.

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Μάλιστα το μάθαμε και αυτο :-D

 

Το seed της srand δεν προλαβάινει να αλλάξει μέσα σε μια for

αρα παράγεται ο ιδιος αριθμός!

 

>

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

   int main(void)
  {
   
   int r , i , count=0;
   
 //srand(time(NULL));  
 
 for(i=0;i<100; i++)
 {  
	 
	 srand(time(NULL));  
	 r=rand()%6+1;
	 printf("\n %d : %d" , ++count , r);
 }
   
return 0 ;
}

 

Ευχαριστω το παπάκι και ολους γενικα για τις καλες απαντήσεις.

 

@migf1 δεν θελω να ρωταει μετα απο κάθε roll απλα θελω να ρωτάει μετα απο κάθε roll που ειναι win ή lose. :P

 

>
You rolled: 9 
Your point is: 9 
You rolled: 6 
Your point is: 6 
You rolled: 6 
Your point is: 6 
You rolled: 8 
Your point is: 8 
You rolled: 5 
Your point is: 5 
You rolled: 8 
Your point is: 8 
You rolled: 3 
Your point is: 3 
You lose with : 3 score  --> ΕΔω δεν ρωταει..... 
You rolled: 6 
Your point is: 6 
You rolled: 9 
Your point is: 9 
You rolled: 11 
Your point is: 11 
You win with : 11 score --> Εδω ρωταει
Play again?

 

 

Edit: Οπως λεει και ο παπι απο πανω, γιατι την srand την καλεις συνεχεια μεσα στην roll_dice ?

 

Για να ανανεώνει το seed καθε φορα που θα την καλούσα.

Kαθε φορα που την καλείς δεν αναεώνεται το seed? ή αρκει μια φορα

και μετα αν καλεις την rand αλλαζει απο μονο του και το seed?

 

σορρυ για τη ζαλουρα αλλα προσπαθω να το καταλαβω :/

 

EDIT: Βασικα ισχυει αυτο που ειπα τωρα στο τελος , οτι η srand αρκει να κληθει μια φορα και μετα για καθε κληση της rand γινεται re-initialize του seed αρα προκυπτει και διαφορετικη ψευδοτυχαια ακολουθια.

Δημοσ.

@migf1 δεν θελω να ρωταει μετα απο κάθε roll απλα θελω να ρωτάει μετα απο κάθε roll που ειναι win ή lose. :P

...

 

 

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

#define WIN(x)		( 7 == (x) || 11 == (x) )
#define LOSE(x)		( 2 == (x) || 3 == (x) || 12 == (x) )
#define DEUCE(x)	( !WIN(x) && !LOSE(x) )

// ---------------------------------------------------------
char askuser( const char *prompt )
{
char input[256] = {'\0'};

if ( prompt )
	printf( prompt );

fgets( input, 256, stdin );
return tolower(*input);
}
// ---------------------------------------------------------
int roll( void )
{
return (rand() % 6 + 1) + (rand() % 6 + 1);
}
// ---------------------------------------------------------
int main( void )
{
bool	playmore = true;
int 	rolled = 0;

srand( time(NULL) );

while ( playmore )
{
	printf("You rolled %d...", (rolled = roll()) );
	if ( DEUCE(rolled) )
		puts( "it's a deuce!" );
	else {
		puts( WIN(rolled) ? "you win!" : "you loose!" );
		playmore = 'n' != askuser("play more (/n)? ");
	}
}

   	exit( 0 );
}

 

 

 

...

σορρυ για τη ζαλουρα αλλα προσπαθω να το καταλαβω :/

Τη γεννήτρια συνήθως την ενεργοποιούμε μια φορά. Η συνεχής της ενεργοποίηση μπορεί να έχει νόημα σε security sensitive εφαρμογές, αλλά εκεί χρησιμοποιούνται custom αλγόριθμοι (ή εξωτερικές βιβλιοθήκες).

Δημοσ.

 

 

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

#define WIN(x)		( 7 == (x) || 11 == (x) )
#define LOSE(x)		( 2 == (x) || 3 == (x) || 12 == (x) )
#define DEUCE(x)	( !WIN(x) && !LOSE(x) )

// ---------------------------------------------------------
char askuser( const char *prompt )
{
char input[256] = {'\0'};

if ( prompt )
	printf( prompt );

fgets( input, 256, stdin );
return tolower(*input);
}
// ---------------------------------------------------------
int roll( void )
{
return (rand() % 6 + 1) + (rand() % 6 + 1);
}
// ---------------------------------------------------------
int main( void )
{
bool	playmore = true;
int 	rolled = 0;

srand( time(NULL) );

while ( playmore )
{
	printf("You rolled %d...", (rolled = roll()) );
	if ( DEUCE(rolled) )
		puts( "it's a deuce!" );
	else {
		puts( WIN(rolled) ? "you win!" : "you loose!" );
		playmore = 'n' != askuser("play more (/n)? ");
	}
}

   	exit( 0 );
}

 

 

 

 

Τη γεννήτρια συνήθως την ενεργοποιούμε μια φορά. Η συνεχής της ενεργοποίηση μπορεί να έχει νόημα σε security sensitive εφαρμογές, αλλά εκεί χρησιμοποιούνται custom αλγόριθμοι (ή εξωτερικές βιβλιοθήκες).

 

OK. eYXARISTV θα κοιταξω τον κωδικα πιο μετα γιατι εχω κατι αλλα τωρα...γενικα δεν τελειωνεις και ποτε :/

πας να κανεις κατι και σου βγαινουν αλλα 100 μπροστα στη C ή γενικοτερα στον προγραμματισμο.

 

Εγω για την srand νομιζα (χωρις να το εχω τσεκαρει) οτι αλλαζει το seed μονο σε κάθε κληση της ή σε κάθε εκτέλεση του προγραμματος (που οκ θα έχει και τη κληση της μεσα). Αλλα εδω απο οτι βλεπω αλλαζει κάθε φορα που καλεις την rand και εχει περασει 1 second. Αυτο ειναι σωστο που γραφω?

 

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

   int main(void)
  {
   
   int r , i , count=0;
   
 srand(time(NULL));  
 
 for(i=0;i<5; i++)
 {  
	 
	 //srand(time(NULL));  
	 r=rand()%6+1;
	 printf("\n %d : %d\n" , ++count , r);
 }
 
 
 for(i=0; i<5; i++)
 {
     r=rand()%6+1;
     printf("\n :%d \n" , r);
 }
 
 for(i=0; i<5; i++)
 {
	 r=rand()%6+1;
	 printf(" \n :%d " , r);
 }
   
return 0 ;
}

 

EDIT: Σωστο ειναι.

 

Πχ :

 

>

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

   int main(void)
  {
   
   int r , i , count=0;
   
 srand(time(NULL));  
 
 for(i=0;i<5; i++)
 {  
	 
	 //srand(time(NULL));  
	 r=rand()%6+1;
	 printf("\n %d : %d\n" , ++count , r);
 }
 

        printf(" \n %d \n ", r);
        
        
return 0 ;
}

 

ΟUTPUT

 

>

1 : 5

2 : 6

3 : 1

4 : 6

5 : 6

6 

 

Επειδη το r εξω απο το loop ισουται με το τελευταιο r μεσα στο loop.

 

αΝ εχω γραψει καμια πίπα το λέτε έτσιο??? Δεν βαριεστε!!! Αλλιως θα καθομουν να κανω δοκιμες μονος μου! Παρολαυτα προτιμω τη συζητηση και το ομαδικο πνευμα :P

Δημοσ.

Η srand() παράγει μια ακολουθία ακεραίων από 0 έως RANDMAX και κατόπιν η rand() χρησιμοποιεί αυτή την ακολουθία για να διαλέξει (υποτίθεται) τυχαία έναν αριθμό. Αν ξανακαλέσεις την srand() με το ίδιο όρισμα, επαναλαμβάνει την ίδια ακολουθία. Αυτά αναγράφονται στην τεκμηρίωση των srand() και rand()... τις διάβασες;

 

Η time(NULL) με την οποία αρχικοποιείς την srand() επιστρέφει την ώρα σε μορφή δευτερολέπτων (δεν είναι στάνταρ, αλλά οι περισσότεροι compilers μορφή δευτερολέπτων χρησιμοποιούν ως επιστροφή της time() ). Αυτά αναγράφονται στην τεκμηρίωση της time() ... την διάβασες;

 

Οπότε καλώντας εσύ συνεχώς την srand() με όρισμα time(NULL) πολλές φορές κατά τη διάρκεια ενός δευτερολέπτου, αυτό που κάνεις είναι να κάνεις συνεχώς reset στον εαυτό της την ακολουθία ακεραίων που παράγει η srand().

Δημοσ.

Η srand() παράγει μια ακολουθία ακεραίων από 0 έως RANDMAX και κατόπιν η rand() χρησιμοποιεί αυτή την ακολουθία για να διαλέξει (υποτίθεται) τυχαία έναν αριθμό. Αν ξανακαλέσεις την srand() με το ίδιο όρισμα, επαναλαμβάνει την ίδια ακολουθία. Αυτά αναγράφονται στην τεκμηρίωση των srand() και rand()... τις διάβασες;

 

Η time(NULL) με την οποία αρχικοποιείς την srand() επιστρέφει την ώρα σε μορφή δευτερολέπτων (δεν είναι στάνταρ, αλλά οι περισσότεροι compilers μορφή δευτερολέπτων χρησιμοποιούν ως επιστροφή της time() ). Αυτά αναγράφονται στην τεκμηρίωση της time() ... την διάβασες;

 

Οπότε καλώντας εσύ συνεχώς την srand() με όρισμα time(NULL) πολλές φορές κατά τη διάρκεια ενός δευτερολέπτου, αυτό που κάνεις είναι να κάνεις συνεχώς reset στον εαυτό της την ακολουθία ακεραίων που παράγει η srand().

 

ΟΚ. Δεν τα διαβασα αλλα τα ηξερα τα περισσοτερα.

Το θεμα ειναι πως η ερωτηση μου ειναι πιο περιεργη δεν ξερω μηπως ειναι και μλκια .

Αλλα ψαχνω να δω κατα ποσο επηρεαζεται η rand απο το οτι η srand κανει reset συνεχως τον εαυτο της

μεσω loop και εφοσον δεν εχει προλαβει να αλλαξει το seed της. Για αυτο και αρχικα ρωτησα

γιατι την βγαζουμε στην main().

 

Η rand διαλεγει τυχαια απο την ακολουθια 1 2 3 4 5 6 ..... 100000 ας πουμε.

Αν η srand παράξει 2 φορες την ιδια παραπανω ακολουθια... τι εμποδιζει την rand να διαλεξει την μια

το 2 και την άλλη το 3 πχ. επειδη στο δικο μου προγραμμα εβγαζε συνεχως το 2 οπως εδειξα ή το 3 μεχρι να αλλαξει το seed τελοςπαντων.

Δημοσ.

Διότι προφανώς η rand() δεν διαλέγει τυχαία νούμερα από την ακολουθία, αλλά τα πιάνει από την αρχή κάθε φορά που καλείται η srand(). Και λέω "προφανώς" (και όχι "σίγουρα") γιατί δεν θυμάμαι ακριβώς τι κάνει η rand().

 

Googlaρε το να το βρεις ;)

Δημοσ.

Διότι προφανώς η rand() δεν διαλέγει τυχαία νούμερα από την ακολουθία, αλλά τα πιάνει από την αρχή κάθε φορά που καλείται η srand(). Και λέω "προφανώς" (και όχι "σίγουρα") γιατί δεν θυμάμαι ακριβώς τι κάνει η rand().

 

Googlaρε το να το βρεις ;)

 

Έγινε. Ευχαριστω και παλι για την υπομονη σου.

Θα το ψάξω και θα επανέλθω να δουμε πως ακριβως δουλευει.

Έχει ενδιαφερον . ;)

Δημοσ.

Διότι προφανώς η rand() δεν διαλέγει τυχαία νούμερα από την ακολουθία, αλλά τα πιάνει από την αρχή κάθε φορά που καλείται η srand(). Και λέω "προφανώς" (και όχι "σίγουρα") γιατί δεν θυμάμαι ακριβώς τι κάνει η rand().

 

Googlaρε το να το βρεις ;)

 

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

int main(void)
{
int i;

srand(5);
for (i = 0; i < 10; i++)
	printf("%d ",rand());
printf("\n");

srand(5);
for (i = 0; i < 10; i++)
	printf("%d ",rand());
printf("\n");

return 0;
}

>
590011675 99788765 2131925610 171864072 317159276 171035632 602511920 963050649 1069979073 1919854381 
590011675 99788765 2131925610 171864072 317159276 171035632 602511920 963050649 1069979073 1919854381 

Όπως βλέπουμε, το παραπάνω χαζό πρόγραμμα επιστρέφει δύο φορές την ίδια ακολουθία αριθμών. Μπακάλικα/καταχρηστικά θα μπορούσαμε να πούμε ότι η rand δεν επιστρέφει καν τυχαίους αριθμούς αλλά ξεκινάς με τον seed και με βάση κάποιο αλγόριθμο παράγει τον επόμενο αριθμό για αυτό παίρνουμε την ίδια ακολουθία (ξεχνώντας την περίπτωση generator με βάση τη θερμοκρασία του επεξεργαστή, τα πακέτα της κάρτα δικτύου, κτλ που υπάρχουν σε κάποιους επεξεργαστές).

 

Με το να τρέχουμε την srand μέσα στο βρόχο θα παίρνουμε τον πρώτο παραγόμενο αριθμό από το εκάστοτε seed το οποίο δεν νομίζω να είναι πιο ασφαλές από ό,τι να πάρουμε τους επόμενους στην σειρά αριθμούς με σταθερό seed. Τουλάχιστον δεν ακούγεται λογικό και δεν το έχω δει σε κάποιο πρόγραμμα.

 

Αν και γενικά η rand δεν δίνει και τόσο καλά αποτελέσματα, μια βελτίωση που μπορούμε να κάνουμε είναι να μην χρησιμοποιούμε την μορφή rand()%τάδε. Όταν πχ έχουμε rand()%6 τότε θα βρούμε το υπόλοιπο της διαίρεσης με το 6 άρα θα έχουμε ένα αριθμό από το 0 μέχρι το 5. Σε πολλές υλοποιήσεις όμως οι αριθμοί που παράγονται δεν έχουν και τόσο τυχαία κατανομή στο low κομμάτι τους. Ένας από τους πολλούς τρόπους που προτείνονται για να χρησιμοποιηθούν τα high bits είναι ο παρακάτω

>
rand() / (RAND_MAX / 6 + 1)

 

Ο παραπάνω τρόπος όπως και ένας ακόμη καλύτερος (αλλά overkill κατά τη γνώμη μου) με συνεχόμενες εκτελέσεις της rand σε βρόχο περιγράφονται εδώ

 

Και φυσικά να μην ξεχνάμε το παρακάτω κλασικό :P

random_number.png

Δημοσ.

 

 

Με το να τρέχουμε την srand μέσα στο βρόχο θα παίρνουμε τον πρώτο παραγόμενο αριθμό από το εκάστοτε seed το οποίο δεν νομίζω να είναι πιο ασφαλές από ό,τι να πάρουμε τους επόμενους στην σειρά αριθμούς με σταθερό seed. Τουλάχιστον δεν ακούγεται λογικό και δεν το έχω δει σε κάποιο πρόγραμμα.

 

 

 

Η rand() παιρνει κάθε φορα τον πρωτο παραγόμενο αριθμο απο την ακολουθια που έχει παράξει η srand???

arggggggggggggggggggggggg :mad: :mad: :mad:

 

Btw ενα πολυ καλο λινκ που βρηκα

 

http://www.math.utah.edu/~pa/Random/Random.html

 

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

 

Bεβαια εδω λεει

 

http://proanswers.org/1853/how-rand-function-in-c-programming-language-works

 

Πως ετσι δουλευει η rand.

 

http://en.wikipedia.org/wiki/Linear_congruential_generator

 

Y.Γ Σκάλωσα τωρα...θελω να βρω γιατι επηρεάζεται η rand και δινει ιδιους τυχαίους" εφοσον η srand κανει reset με ιδιο seed και παραγει ιδιες ακολουθιες και αυτη :/

Δημοσ.

...

Y.Γ Σκάλωσα τωρα...θελω να βρω γιατι επηρεάζεται η rand και δινει ιδιους τυχαίους" εφοσον η srand κανει reset με ιδιο seed και παραγει ιδιες ακολουθιες και αυτη :/

Τι εξηγήσαμε κι εγώ κι ο imitheos μόλις πριν 2-3 ποστ; Αυτό δεν εξηγήσαμε;

Δημοσ.

Star_light μας τρολλαρεις τωρα ;

 

Μην ψαχνεις παραπανω κατι που αυτη τη στιγμη δεν σου χρειαζεται. Οι "τυχαιοι" αριθμοι ειναι ενα μεγαλο κεφαλο στoν τομεα των πιθανοτητων,που ναι μεν βασιζεται σε βασικες αρχες και νομους , αλλα ειναι δυσκολο για καποιον που δεν εχει σχεση με το αντικειμενο να το ψαξει παραπερα.

 

Αυτο που χρειαζεται να ξερεις για τωρα, εχει απαντηθει στις προηγουμενες σελιδες. Οταν χρειαζεσαι τυχαιους αριθμους , καλεις την srand ΜΙΑ φορα στην αρχικοποιηση του προγραμματος σου ( προτου κανεις οτιδηποτε ) και οποτε χρειαζεσαι ενα τυχαιο αριθμο απλα καλεις την rand. Ευκολο ;

Δημοσ.

Τι εξηγήσαμε κι εγώ κι ο imitheos μόλις πριν 2-3 ποστ; Αυτό δεν εξηγήσαμε;

 

Οκ το καταλαβα.

 

Star_light μας τρολλαρεις τωρα ;

 

Μην ψαχνεις παραπανω κατι που αυτη τη στιγμη δεν σου χρειαζεται. Οι "τυχαιοι" αριθμοι ειναι ενα μεγαλο κεφαλο στην τομεα των πιθανοτητων,που ναι μεν βασιζεται σε βασικες αρχες και νομους , αλλα ειναι δυσκολο για καποιον που δεν εχει σχεση με το αντικειμενο να το ψαξει παραπερα.

 

Αυτο που χρειαζεται να ξερεις για τωρα, εχει απαντηθει στις προηγουμενες σελιδες. Οταν χρειαζεσαι τυχαιους αριθμους , καλεις την srand ΜΙΑ φορα στην αρχικοποιηση του προγραμματος σου ( προτου κανεις οτιδηποτε ) και οποτε χρειαζεσαι ενα τυχαιο αριθμο απλα καλεις την rand. Ευκολο ;

 

Εγω δεν ψάχνω τυχαιους αριθμους εγω ηθελα να μαθω απλα πως διαλεγει η rand αριθμους απο την srand που εχει βγαλει την ακολουθια.

Αν δημιουργειται τοσο μεγαλο προβλημα το κλεινουμε το θεμα.

 

Δεν χρειαζεται να γινεται θεμα απο εκει που δεν υπάρχει. :rolleyes:

Δημοσ.

Εγω δεν ψάχνω τυχαιους αριθμους εγω ηθελα να μαθω απλα πως διαλεγει η rand αριθμους απο την srand που εχει βγαλει την ακολουθια.

Αν δημιουργειται τοσο μεγαλο προβλημα το κλεινουμε το θεμα.

 

Δεν χρειαζεται να γινεται θεμα απο εκει που δεν υπάρχει. :rolleyes:

 

Κανενα προβλημα δεν δημιουργειται. Απλα επιμενεις σε κατι που εχει ηδη απαντηθει στις προηγουμενες σελιδες.

 

Το πως διαλεγει η rand τους αριθμους ειναι δικο της θεμα.Να μην σε απασχολει( για τωρα... ).

Αντιστοιχα , θα μπορουσες να ρωτησεις : πως δουλευει η printf ? Χρησιμοποιεις καθε μερα printf , αλλα δεν ξερεις πως υλοποιειται...

 

ΜΗΝ ΤΟΛΜΗΣΕΙΣ ΝΑ ΔΕΙΣ ΚΩΔΙΚΑ ΓΙΑ ΤΗΝ printf. Θα τρεχεις και δεν θα φτανεις μετα... ^_^

 

Δημοσ.

+1 στον Χρήστο. Διότι σε τι ακριβώς θα σε βοηθήσει πρακτικά το να μάθεις πως υλοποιείται η rand();

 

Συν ότι μερικά από τα links που παρέθεσες αναλύουν πιθανές υλοποιήσεις της rand(), οπότε ποιο το νόημα αφενός να μας τα παραθέτεις links που εξηγούν αυτό που ρωτάς και ταυτόχρονα να ρωτάς και μας; Παρόλα αυτά, απλά και μόνο από περιέργεια, ορίστε μια ακόμα απλοποιημένη εξήγηση πιθανής υλοποίησης: http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random-numbers-with-rand/1109109#1109109

 

EDIT: διόρθωση του link.

 

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...