Estrarre una sola volta un numero casuale

Stato
Discussione chiusa ad ulteriori risposte.

Noixe

Utente Silver
27 Dicembre 2008
0
0
0
55
Ciao a tutti,

in occasione di questo periodo di festa, vi propongo un esercizio applicabile alla realizzazione del gioco della tombola.

Realizzare un algoritmo che estragga una sola volta un numero casuale da un intervallo variante tra 1 e 90.

Io ho usato il C++.

Saluti
 
la sezione prevede che proposto un esercizio ogni utente postare il proprio codice ed eventualmente discuterne con gli altri user...mica è una sfida di programmazione!
 
Io ho sviluppato un codice simile nel mio gioco dell'impiccato, cioè prendeva un numero da 1 al limite massimo del file e lo segnava in un array. ogni volta controllava se il numero estratto era presente nell'array , se era presente rieseguiva la funzione (ricorsiva) altrimenti lo metteva nell'array ed lo usava. mi sono spiegato un pò male xD
 
Ok, adesso posto la mia soluzione, pensavo che gli esercizi fossero pensati per allenarsi.

Nel mio codice non controllo ogni volta se il numero è stato estratto perchè viene automaticamente scartato:

Codice:
#include <iostream>
#include <ctime>

// Max è la variabile che servirà per tener traccia di quale estrazione è 
// stata fatta. num è un array che conterrà i 90 numeri

int Max = 90, num[90];


// Con questa funzione estraiamo i secondi dell'ora attuale. 
// Tale valore servirà
// per inizializzare il generatore di numeri casuali

int seed() {
    time_t t; 
    time(&t);
    return (ctime(&t)[17] - 48) * 10 + ctime(&t)[18] - 48;
};


int main() {
    
    // Inserisco i 90 numeri all'interno dell'array
    for (int i = 0; i < 90; i++)
        num[i] = i + 1;
    
    // Inizializzo il generatore di numeri casuali
    srand(seed());
    
    // Per 90 volte...
    for (int i = 0; i < 90; i++) {
        // Estraggo un numero casuale variante tra 0 e Max - 1
        // Ad ogni ciclo Max sara' decrementato di 1
        int j = (rand() % Max--);
        // Stampo il j-esimo elemento dell'array
        std::cout << num[j] << " ";
        // Sovrascrivo tale valore col il Max-esimo dell'array in modo tale
        // che non possa più essere estratto
        num[j] = num[Max];
    };
    
    return 0;
}
 
Noixe ha detto:
Realizzare un algoritmo che estragga una sola volta un numero casuale da un intervallo variante tra 1 e 90.
Non hai detto UNA SOLA VOLTA? Perché leggendo il tuo codice in C++ estrae ben 90 numeri...
Se fosse solo 1 volta in php sarebbe molto semplice, ma anche in tanti altri linguaggi:
PHP:
<?php
echo rand(1,90);
?>
 
Per "una sola volta" intendevo dire senza ripeterlo. Ovvio che intendessi l'estrazione di una sequenza di numeri. Ho fatto anche riferimento alla tombola :)

Ciao
 
c++

Codice:
#include <iostream>
#include <scroll.h>  // <---@Jacoboss: look at this :D
using namespace std;

int tombola(){
  int x=rand()%91;
  if (x==0) x++;
  return x;
}

int main()
{
  int x[90], y, q=0;
  for (y=0; y<90; y++){
    x[y]=tombola(); 
    while(q<y){
      if (x[q]==x[y]) {
               x[y]++;
               while(x[y]>90) {x[y]-=90;}
                q=0;
              }
       else q++;
       }
     }
   for (y=0; y<90; y++) {
       scroll("\nIl prossimo numero estratto e\'...",BIANCO);
       cout << x[y] << endl << endl;
       system("pause");
       }
 return 0;       
}

edit: ho agiunto dei controlli che avevo dimenticato
 
Certo non rispecchia proprio "l'estrazione" ma il risultato è lo stesso:
PHP:
<?php
for ($i=1;$i<=90;$i++) {
	$numeri[$i] = $i;
}
shuffle($numeri);
$newordine = implode("<br>",$numeri);
echo $newordine;
?>
 
Lepa il tuo codice va in un ciclo infinito.

Inoltre non ho la libreria scroll.

Simus, nel tuo codice mi sa che la parte difficile la fa la funzione shuffle... deve realizzarne una tu :D
 
mi potresti dire dove il ciclo ti sembra infinito?

ps: per la libreria scroll vai qua---> http://www.infernet-x.com/c-c-c/-c-c-scroll-h-t-13317.html
 
Per Lepa:

L'ho provato e va in loop infinito. Credo che il problema sia qui:

Nel primo while, la q rimane sempre minore uguale a y perche' l'incremento si trova solo nell'else.

Tu lo hai provato quel codice?

Per Simus:
Eheh, va be lo scopo dell'esempio era quello di scrivere quel tipo di algoritmo, puoi studiare quello scritto da me se vuoi.
 
:eek: oddio che fava che sono, è vero, while(q<y) perchè se q è uguale a y anche x[q] è uguale a x[y]...non ci avevo pensato...
 
Stato
Discussione chiusa ad ulteriori risposte.