Visualizzazione dei risultati da 1 a 7 su 7

Hybrid View

  1. #1
    Dunque, ho spulciato un po' in giro, e apparentemente il problema sta nella CRT Microsoft (che MinGW sfrutta per un po' di roba, tra cui appunto la srand/rand). Per come è implementata la srand nel runtime Microsoft, il primo numero generato da rand() ha una dipendenza molto stretta dal seed; stampando semplicemente il primo valore restituito da rand() in run successive (=> i seed differiscono solo di 1) ottengo
    codice:
    27250
    27253
    27256
    27260
    27263
    e non siamo i primi a notare il problema. Dato che il primo metodo rimappa in maniera lineare il range della rand sul range desiderato, questa scarsa casualità del primo estratto si nota anche sul numero che ne derivi (mentre è "nascosta" dal modulo nel secondo metodo).

    Ergo, puoi fare due cose:
    - scartare il risultato della prima rand(), visto che dalle successive va avanti giusto;
    - come suggerisce brancomat, puoi recuperare un altro generatore di numeri casuali; se ti basta un LCG puoi rubacchiare una qualunque implementazione più robusta (già quella di glibc è molto meglio - tra l'altro, ha un RAND_MAX molto più alto e un periodo molto più lungo rispetto a quello della CRT Microsoft), oppure, se hai necessità di numeri casuali "di alta qualità", puoi tirare fuori le armi pesanti e usare, ad esempio, il classico Mersenne Twister (si trovano diverse implementazioni free in giro).
    Amaro C++, il gusto pieno dell'undefined behavior.

  2. #2
    Mi scuso per il ritardo nella risposta ma spero siano graditi ugualmente i miei ringraziamenti. La prima cosa è che...ci avevo visto giusto!La mia osservazione non era peregrina.Vale a dire le prove che avevo fatto erano corrette.
    Per quanto riguarda l'uso,se la rand () che utilizza la CRT "difettosa" verrà usata per riempire un array...il problema non si pone.L'imperfezione arriva solo ed esclusivamente quando si genera un solo numero.
    Se vi volete sbizzarrire qui lo si vede palese il "baco".

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    void main(void){
    int a,b;
    srand(time(0));
    /* prototipo generatore numeri random INTERI compresi in un intervallo di INTERI */
    printf("inserisci estremo a\n");
    scanf("%d",&a);
    printf("inserisci estremo b\n");
    scanf("%d",&b);
    double prova = (double) (RAND_MAX+1.0);
    int numero = rand();
    printf("ecco il primo numero estratto %d\n",numero);
    int ris1= (int) (b-a+1)*(numero/(double)(RAND_MAX+1.0)) + a;
    printf("estrazione adattata con il primo rand %d\n",ris1);
    int num2 = rand();
    printf("ecco il secondo numero estratto %d\n",num2);
    int ris2 =(double)(num2/prova)*(b-a+1);
    printf("estrazione adattata con il secondo rand %d\n",ris2);
    int risultato2= rand()%(b-a+1)+a;
    printf("ecco il numero estratto con divisione in modulo %d\n",risultato2);
    }
    Volevo invece farvi due domande:

    1) in ambiente Linux visto che non si usano le CRT (o meglio il Gcc ha altre librerie per il run-time) il problema non dovrebbe presentarsi corretto?
    2) avrei un quesito su Virtual Box,in che area lo posso postare?

    Grazie ancora a tutti per la pazienza
    Un saluto
    A.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.