Funzione random in devc++ [stdio.h]
Sto facendo dei programmini con devc++. Di libreria ho a disposizione solo stdio.h (o in aggiunta al massimo anche conio.h). Quello che mi serve è usare il fattore random. Mi spiego con un esempio: voglio simulare l'esito di una partita di bocce sapendo la bravura di due giocatori: Marco=85 e Simone=54. Ecco ora un metodo sarebbe che Marco ha $85/139$ di probabilità di vincere e Simone $54/139$.
Come faccio a far uscire un numero random da 1 a 139 in modo che se esce da 1 a 85 vince Marco, altrimenti vince Simone?
Spero di essermi spiegato abbastanza bene: cerco la "sintassi", es: a=srand()... Mi sa che è qualcosa del genere ma non ricordo e non trovo online riferimenti utili... Grazie
Come faccio a far uscire un numero random da 1 a 139 in modo che se esce da 1 a 85 vince Marco, altrimenti vince Simone?
Spero di essermi spiegato abbastanza bene: cerco la "sintassi", es: a=srand()... Mi sa che è qualcosa del genere ma non ricordo e non trovo online riferimenti utili... Grazie
Risposte
Immagino tu sia uno studente universitario intento a seguire un corso con un professore che non programma da almeno 15 anni. A questo scopo devo informarti di 2 cose:
1. Dev-C++ è un programma che non viene aggiornato dal 2005, e la versione di quell'anno era una versione beta;
2. conio.h non appartiene allo Standard C++ e neanche C, essendo inoltre poco portabile sarebbe meglio evitarla.
pertanto dovresti usare qualcosa di più aggiornato come, per esempio, code::blocks e limitarti alle funzioni standard.
Riguardo al tuo problema non vedo come limitardosi a stdio.h tu possa fare quello che vuoi fare. Nel C e anche nel C++ esiste nella libreria standard stdlib.h (in C++ si tende ad usare la notazione cstdlib omettendo il .h) la funzione rand (in genere si usa anche time.h per inizializzare il RNG). Nel C++, nell'ultimo standard è stata creata una nuova libreria chiamata random ma il suo uso è meno immediato per un principiante.
1. Dev-C++ è un programma che non viene aggiornato dal 2005, e la versione di quell'anno era una versione beta;
2. conio.h non appartiene allo Standard C++ e neanche C, essendo inoltre poco portabile sarebbe meglio evitarla.
pertanto dovresti usare qualcosa di più aggiornato come, per esempio, code::blocks e limitarti alle funzioni standard.
Riguardo al tuo problema non vedo come limitardosi a stdio.h tu possa fare quello che vuoi fare. Nel C e anche nel C++ esiste nella libreria standard stdlib.h (in C++ si tende ad usare la notazione cstdlib omettendo il .h) la funzione rand (in genere si usa anche time.h per inizializzare il RNG). Nel C++, nell'ultimo standard è stata creata una nuova libreria chiamata random ma il suo uso è meno immediato per un principiante.
ho provato a scaricare devc++ anche su windows 8 ma l'unico programma che ho trovato è stato questo. come programma andrebbe anche bene, l'unico problema è che,a quanto pare, contiene SOLO la libreria stdio.h... hai idea di come possa fare per installare altre librerie??
comunque io in passato ero riuscito ad usare una funzione random anche con la libreria stdio.h, ma non ricordo come...
PS: dato che ritieni devc++ un brutto programma (o comunque vecchio), riesci a consigliarmene uno simile ma migliore? (che io riesca ad utilizzare con le me conoscnze di c, senza corsi). grazie per la risposta....
comunque io in passato ero riuscito ad usare una funzione random anche con la libreria stdio.h, ma non ricordo come...
PS: dato che ritieni devc++ un brutto programma (o comunque vecchio), riesci a consigliarmene uno simile ma migliore? (che io riesca ad utilizzare con le me conoscnze di c, senza corsi). grazie per la risposta....
In effetti, come già detto da Vict, potresti provare a scaricare Code::Blocks( http://www.codeblocks.org/), facendo attenzione a scaricare la versione che comprende il compilatore

Ecco un elenco:
1. Code::blocks - è abbastanza semplice e completo, devi installarti la versione con MinGW. Puoi usarlo sia per C che per il C++. Su windows non c'è una versione a 64bit.
2. CodeLite - è tipo code::blocks. Anche qui ricordati di installare la versione con MinGW. Anche lui puoi usarlo per C e C++ (usano lo stesso compilatore, che poi è anche quello di Dev-C++). È più difficile capire che versione installare.
3. Orwell Dev-C++ - un Dev-C++ ripreso e ‘aggiornato’. Sinceramente però suggerisco gli altri. Anche lui sia per C che per C++.
4. Pelles C IDE - è solamente per il C e non usa MinGw né si basa su GCC. Funziona solo su windows. Ma nel supporto degli ultimi standard del C è imbattibile.
5. Visual Studio 2012 Express - La versione ridotta del famoso IDE di Microsoft. Usa la versione per desktop. Il supporto al C è rimasto allo standard dell'89 e ha un po' le sue opinioni su cosa sia sicuro e cosa no. In generale non lo si usa per scrivere in standard C. Riguardo al C++ il suo supporto è buono, anche se non perfetto*. Il suo supporto del C++ è differente rispetto a GCC/MinGW e quindi a seconda del codice potrebbe darti più problemi l'uno o l'altro. A parte questo è un IDE ben strutturato. La versione 2013, sperando ne facciano anche l'express, dovrebbe migliorare il supporto al C.
Un po' più difficile da installare c'è anche Eclipse CDT.
* neanche il supporto di GCC è perfetto, il miglior compilatore sotto questo aspetto è clang+llvm che però è difficile da installare su windows e anche dopo installato funziona comunque peggio che su linux. Rispetto a GCC, MinGW ha un supporto ovviamente peggiore (MinGW è basato su un GCC più vecchio).
1. Code::blocks - è abbastanza semplice e completo, devi installarti la versione con MinGW. Puoi usarlo sia per C che per il C++. Su windows non c'è una versione a 64bit.
2. CodeLite - è tipo code::blocks. Anche qui ricordati di installare la versione con MinGW. Anche lui puoi usarlo per C e C++ (usano lo stesso compilatore, che poi è anche quello di Dev-C++). È più difficile capire che versione installare.
3. Orwell Dev-C++ - un Dev-C++ ripreso e ‘aggiornato’. Sinceramente però suggerisco gli altri. Anche lui sia per C che per C++.
4. Pelles C IDE - è solamente per il C e non usa MinGw né si basa su GCC. Funziona solo su windows. Ma nel supporto degli ultimi standard del C è imbattibile.
5. Visual Studio 2012 Express - La versione ridotta del famoso IDE di Microsoft. Usa la versione per desktop. Il supporto al C è rimasto allo standard dell'89 e ha un po' le sue opinioni su cosa sia sicuro e cosa no. In generale non lo si usa per scrivere in standard C. Riguardo al C++ il suo supporto è buono, anche se non perfetto*. Il suo supporto del C++ è differente rispetto a GCC/MinGW e quindi a seconda del codice potrebbe darti più problemi l'uno o l'altro. A parte questo è un IDE ben strutturato. La versione 2013, sperando ne facciano anche l'express, dovrebbe migliorare il supporto al C.
Un po' più difficile da installare c'è anche Eclipse CDT.
* neanche il supporto di GCC è perfetto, il miglior compilatore sotto questo aspetto è clang+llvm che però è difficile da installare su windows e anche dopo installato funziona comunque peggio che su linux. Rispetto a GCC, MinGW ha un supporto ovviamente peggiore (MinGW è basato su un GCC più vecchio).
Dimenticavo. Io sul mio pc ho installati attualmente CodeLite, Pelles e Visual Studio. Per le mie cose preferisco gli ultimi due. Con Code::blocks ogni tanto ci litigo e quindi ho puntato su CodeLite per far andare il codice di MinGW. Per ora non ci ho ancora litigato
.

"vict85":
Dimenticavo. Io sul mio pc ho installati attualmente CodeLite, Pelles e Visual Studio. Per le mie cose preferisco gli ultimi due. Con Code::blocks ogni tanto ci litigo e quindi ho puntato su CodeLite per far andare il codice di MinGW. Per ora non ci ho ancora litigato.
A proposito di Code::Blocks io ho una curiosità.
Io so che invece di usare come programma il codice di main.c si può usare anche un codice scritto in un altro file .c ma per farlo bisogna selezionare il target. Ecco la mia domanda è: "Come aggiungo il target? E come lo associo al relativo file?"
Alla fine non è stata ancora data alcuna risposta alla domanda originale, cioè come generare un numero casuale in C compreso tra 1 e 139. Il metodo più semplice è quello di usare l'operatore di resto %. a % b è infatti definito come il numero r tale che \( a = \lfloor a / b \rfloor \, b + r \) ed è quindi compreso tra 0 e b (non incluso). Nel seguente codice la variabile r conterrà quindi un valore compreso tra 1 e 139 come richiesto:
In C si tende tuttavia a preferire ad usare intervalli che iniziano con zero evitando quindi di sommare uno al resto della divisione e quindi usando < al posto <= nel confronto. Il codice è insomma il seguente:
La distribuzione ottenuta non è perfettamente uniforme, ma è probabilmente quello che vuole il tuo professore. Una versione migliore dal punto di vista dell'uniformità della distribuzione è il seguente:
Rimane il discorso sulla inizializzazione del generatore di numeri casuali. Il metodo classico per farlo è di inserire la seguente riga da qualche parte all'inizio del codice, prima di usare rand..
Devi includere le seguenti librerie per usare le funzioni e le costanti che ho usato:
int r = 1 + rand() % 139; if (r <= 85) { /* ... */ } else { /* ... */ }
In C si tende tuttavia a preferire ad usare intervalli che iniziano con zero evitando quindi di sommare uno al resto della divisione e quindi usando < al posto <= nel confronto. Il codice è insomma il seguente:
int r = rand() % 139; if (r < 85) { /* ... */ } else { /* ... */ }
La distribuzione ottenuta non è perfettamente uniforme, ma è probabilmente quello che vuole il tuo professore. Una versione migliore dal punto di vista dell'uniformità della distribuzione è il seguente:
double v = rand() * ( 1.0 / ( RAND_MAX + 1.0 ) ); if (v < 85.0/139.0) { /* ... */ } else { /* ... */ }
Rimane il discorso sulla inizializzazione del generatore di numeri casuali. Il metodo classico per farlo è di inserire la seguente riga da qualche parte all'inizio del codice, prima di usare rand..
srand((unsigned int)time(NULL));
Devi includere le seguenti librerie per usare le funzioni e le costanti che ho usato:
#include <stdlib.h> #include <time.h>
Ok, grazie. Credo di aver capito come generare il numero random ma rimane ancora una cosa: come fare a scaricare/usare/installare la libreria conio.h sul programma che ho scaricato. (non riesco a eseguire manco un programma). Ho letto i consigli che mi sono stati scritti ma non ho idea di cosa e cone fare. Gradirei una spiegazione stile manuale
grazie...

Ma a cosa ti serve conio? Insomma il suo uso principale è legato alla creazione di cose come questo http://www.jlc-software.com/images/console_snake.png o questo http://www.codeproject.com/KB/recipes/C ... CT_001.gif e non certo a progetti che a mala pena usano la console per scrivere i risultati. L'unico pseudo-vantaggio è che puoi inserire un carattere senza che venga scritto sulla console. Ma almeno la usi oppure è solo presente come intestazione?
Mi serve per un gioco (per esempio tris) e poi per scrivere dove voglio nello schermo (con gotoxy) e soprattutto prr cancellare lo schermo ad ogni "giro" del ciclo for.
Sinceramente a quel punto penso che avrebbe avuto senso insegnarvi ncurses e pdcurses che almeno in coppia diventavano sufficientemente portabili. Dopo questo corso non avrai più bisogno di usare quelle librerie. Quindi tanto valeva non farvi cancellare lo schermo e usare metodi di visualizzazione più spartani.
Comunque conio è una libreria che si limita a chiamare una dll di Windows o poco più. Penso che in mingw possa essere inclusa. Sicuro di averti installato l'ide con il compilatore.
Comunque conio è una libreria che si limita a chiamare una dll di Windows o poco più. Penso che in mingw possa essere inclusa. Sicuro di averti installato l'ide con il compilatore.