Generare numeri interi random da min a max

Stato
Discussione chiusa ad ulteriori risposte.

MrDarkest

Utente Silver
2 Novembre 2007
154
6
1
99
L'esercizio consiste nel scrivere una funzione che generi numeri interi casuali con minimo e massimo (compresi) fissati da due parametri

Ecco come ho risolto io in C:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int Random(int min, int max);

int Random(int min, int max)
{
   int valore, diff;
   diff = max-min;
   if (diff != 0)
       return (abs(min + (rand()*time(NULL))%(diff+1))%6)+1;
   else
       return min;
}

int main()
{
      int min;
      int max;
      int casuale;
      printf("Inserisci due numeri interi separati dallo spazio\n");
      scanf("%d",&min);
      scanf("%d",&max);
      casuale =  Random(min, max);
      printf("Il numero generato è\': %d\n",casuale);
      system("pause");
      return 0;
}

Purtroppo però questo algoritmo ritorna quasi sempre gli stessi numeri con periodicità regolare quindi dopo un po' non sembra per niente un' estrazione casuale. Come posso fare per migliorarlo?
 
RE: [C]Generare numeri interi random da min a max

Avevo provato anchio con l'srand ma funziona solo se prelevi il numero una volta al secondo ma se fai più richiami in sequenza da numeri uguali, mi spiego:
se io faccio
Codice:
int numeri[4];
int i;
for(i=0;i<4;i++)
    numeri[i] = Random(min, max);
vengono quattro numeri uguali :(
 
RE: [C]Generare numeri interi random da min a max

Sei sicuro?
Codice:
#include <stdio.h>
#include<time.h>
int main() {
    int i,min=2,max=8;
    srand(time(NULL));
    for(i=0;i<4;i++)
        printf("%d\n",min+rand()%(max-1));

    return 0;
}

out
Codice:
3
3
5
2

Process returned 0 (0x0)   execution time : 0.109 s
Press any key to continue.
 
RE: [C]Generare numeri interi random da min a max

Quindi l'srand è da fare solo una volta?

Edit: cmq a me rimane poco casuale, i numeri si ripetono con ciclicità regolare
 
RE: [C]Generare numeri interi random da min a max

Ma è normale.. non esiste mica un algoritmo che genera numeri casuali. Qui si parla di numeri pseudo casuali.
E comunque mi pare logico che ci sia una ripetizioni, se i voglio generare numeri casuali da 3 a 8 e ne genero 15 è normale che ci siano dei numeri che si ripeto, è pur sempre matematica, se vuoi generare numeri tutti diversi controlla che la funzione non restituisca un numero già presente, e nel caso lo faccia glielo fai rigenerare, ma in questo caso hai un vincolo dato dal numero di numeri generabili, cioè se vai da 2 a 5 puoi generare massimo 4 numeri (estremi compresi).
 
RE: [C]Generare numeri interi random da min a max

il problema sta nella ciclicità delle combinazioni di 4 numeri casuali, es. 4 numeri casuali da 1 a 6.

out 1:
Codice:
4
4
2
2

out 2:
Codice:
4
2
2
2

out 3:
Codice:
6
5
1
2

e poi le sequenze si ripetono in questo ordine tutte le volte che compilo e avvio il programma.
 
RE: [C]Generare numeri interi random da min a max

Scusa... ma questo con quale codice? Con quello che ho postato io non riscontro questa ciclicità nei numeri.
 
RE: [C]Generare numeri interi random da min a max

ma mi sembra inutile farlo per un linguaggio specifico,se uno non sa il C non partecipa all'esercizio!
 
RE: [C]Generare numeri interi random da min a max

R4z0r_Cr4$H ha detto:
ma mi sembra inutile farlo per un linguaggio specifico,se uno non sa il C non partecipa all'esercizio!

Hai ragione razor, scusa, ora edito, potete postare altri linguaggi
 
avevamo provato a fare un andom generator io e ilConte, er numeri 0<=x<=10,ma riscontravamo sempre questa ciclicità. problema della funzione srand legato al clock timing? bho.
pensavo, se si complicassero un po' le cose per rendere, anche su limiti piccoli d numeri, un risultato interessate: creare una sequenza di 100 numeri (o anche di +) compresi nell'intervallo definito con un ciclo e una funz random, dopodichè, usare un altra funzione random che picka gli n numeri che vogliamo dai 100 e ce li presenta. in questo modo si dovrebbe ridurre la possibilità di ripetizioni. altrimenti si può modificare ulteriormente.
ora non ho tempo di mettere in pratica.

@stoner: prima, su 4 numeri che erano, avevi 2 "3"...mi pare che sia una bella ripetizione :)
il tuo era su un intervallo corto,ma quello di darkest erano già 6 numeri.
 
rispondo all'amico masterbound che mi ha tirato in causa e nel contempo cerco di fare chiarezza nel post (anche se pur avendo cercato una spiegazione delle funzioni rand e srand si trova molto poco di dettagliato nella rete, quindi la dico come l'ho capita io...)! ;)

la funzione srand() imposta il seed della generazione di numeri pseudocasuali: il seed non è altro che un certo numero che rapresenta il punto di partenza per generare una serie di numeri pseudocasuali.
La funzione rand() non fa altro che operare sugli x numeri precedenti della serie (non so quanto valga x e ora non avevo voglia di leggermi tutto il codice della funzione rand()...) e con delle lunghe e complesse operazioni su tali numeri ti restituisce il numero successivo della serie.

Quindi se crei un programma come questo (in c++):
Codice:
#include <iostream>
#include <ctime>
using namespace std;

int main () {
    srand(time(null));
    
    for(int i=0; i<100; i++)
       cout<<rand()%10<<endl;

    return 0;   
}
il seed verrà impostato al valore di time(null) e rand ci restituirà i primi 100 numeri della serie pseudorandomizzata.

Se invece scrivo questo:
Codice:
#include <iostream>
#include <ctime>
using namespace std;

int main () {
    srand(time(null));
    
    cout<<rand()%10<<endl;

    return 0;   
}
e lo eseguo per 2 volte in un secondo, questo setterà il seed entrambe le volte a time(null), che per tutto un secondo rimane uguale, e ci restituirà entrambe le volte il primo numero della serie e quindi i due numeri coincideranno perchè l'algoritmo di rand() è sempre lo stesso (ma vah?!...).

Questo spiega perchè il programma di stoner sia casuale (il doppio 3 consecutivo è una coincidenza), mentre il nostro (@masterbound) non lo fosse, essendo una variazione del secondo codice che ho scritto sopra.
Sperando di non averle sparate troppo grosse,
ilConte
 
Beh in php è banale quindi non mi sembra nemmeno 1 esercizio di programmazione
PHP:
<?php
$numero=rand(minimo,massimo);
echo $numero;
?>
 
~Ste ha detto:
Beh in php è banale quindi non mi sembra nemmeno 1 esercizio di programmazione
PHP:
<?php
$numero=rand(minimo,massimo);
echo $numero;
?>

Ehm, lo scopo dell'esercizio è fare proprio una funzioncina rand(), altrimenti sai che ci vuole in Python a fare:
Codice:
#!/usr/bin/python
from random import randint
print randint(minimo, massimo)
 
in java:
Codice:
public MinMaxNum(int min,int max,int numeroDiValori){
        if(min<max){
            int l=(""+max).length();
            String g="1";
            for(int i=0;i<=l-1;i++){
               g+=0;
            }
            for(int i=1;i<=numeroDiValori;){
                int v=(int)(Math.random()*(Integer.parseInt(g)));
                if(v>=min && v<=max){
                    System.out.println(i+"°\t"+v);   
                    i++;
                }
            }
        }else{
            System.out.println("Il primo valore deve essere più piccolo del secondo.");   
        }
    }
 
Scusate ma non ho capito bene cosa volete
Un source come questo?
PHP:
<?php
$min=1; //valore da scegliere
$max=10; //valore da scegliere
if ($min>$max) {
echo ('$min non può essere maggiore di $max');
}else{
$numero=rand();
While($numero<$min || $numero>$max) {
$numero=rand();
}
echo ('Il numero estratto è ' . $numero);
}
?>
 
Stato
Discussione chiusa ad ulteriori risposte.