-
Notifications
You must be signed in to change notification settings - Fork 0
/
minirand.cpp
113 lines (101 loc) · 4.02 KB
/
minirand.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Generazione di numeri "pseudo"casuali
* Author: ER
* Date: 2022/10/28
* Note:
*/
/*
1. Frazioni casuali (minirand)
La funzione int rand() restituisce un valore pseudocasuale compreso tra 0 e RAND_MAX.
Si vuole realizzare un’applicazione che necessita valori pseudocasuali in virgola mobile nell’intervallo [0, 1) (0 incluso, 1 escluso).
Si realizzi un’applicazione che, tramite una funzione con il prototipo:
double miniRand(int nCifre);
generi una sequenza di valori casuali con parte intera uguale a 0 ed nCifre cifre decimali dopo la virgola, verificando il minimo ed il massimo valore restituito dalla funzione miniRand(), in un numero sufficiente di chiamate, nLanci.
La funzione miniRand(), tramite la funzione rand() della libreria cstdlib, deve restituire il numero con rappresentazione decimale costituita da parte intera uguale a 0 e parte frazionaria formata da nCifre cifre, ciascuna estratta casualmente con uguale probabilità.
Ad esempio, se nCifre = 3, la funzione deve estrarre tre cifre decimali casuali (decimi d, centesimi c e millesimi m) e restituire il numero corrispondente, ovvero 0.dcm (punto decimale secondo la notazione anglosassone).
Assunzione: 1 <= nCifre <= 18, 1 <= nLanci <= 10^9.
Formato di input: leggere da tastiera (con controllo di validità) il valore di nCifre ed il numero di estrazioni casuali da effettuare.
Formato di output: due interi in formato decimale corrispondenti al valore minimo e massimo ottenuti dalle estrazioni.
Esempi:
| Input | Output | Note |
| ---------- | ---------------- | --------------------------------------------- |
| 3 100000 | 0 0.999 | Minimo e massimo per un numero a 3 cifre |
| 5 2 | 0.67343 0.96891 | I due valori estratti con 5 cifre frazionarie |
*/
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <limits>
using namespace std;
const bool DEBUG = false;
double miniRand(int nCifre);
long long int getIntInRange(const char *prompt, long long int min, long long int max);
int main(int argc, char *args[])
{
srand(time(nullptr));
cout << "Immetti il numero di cifre ed il numero di lanci";
int nCifre = getIntInRange("", 1, 18);
int nLanci = getIntInRange("", 1, 1'000'000'000);
double min = numeric_limits<double>::max();
double max = numeric_limits<double>::min();
for (int estrazione = 0; estrazione < nLanci; ++estrazione)
{
double casuale = miniRand(nCifre);
if (min > casuale)
{
min = casuale;
}
if (max < casuale)
{
max = casuale;
}
}
cout << min << " " << max << endl;
// successful termination
return 0;
}
double miniRand(int nCifre)
{
double result = 0;
while (nCifre-- > 0)
{
result = (result + rand() % 10) / 10;
}
return result;
}
// versione alternativa
double miniRandBis(int nCifre)
{
double result = 0;
double peso = 1;
while (nCifre > 0)
{
peso /= 10;
result += (rand() % 10) * peso;
nCifre--;
}
return result;
}
/// @brief Acquisisce un intero nell'intervallo [min, max] da tastiera
/// @param prompt messaggio per l'utente
/// @param min minimo valore accettabile
/// @param max massimo valore accettabile
/// @return il valore letto da tastiera
long long int getIntInRange(const char *prompt, long long int min, long long int max)
{
long long int result = 0; // assegno un valore non valido
bool valid;
do
{
cout << prompt;
cin >> result;
valid = (!cin.fail()) && (min <= result) && (result <= max);
if (!valid)
{
cerr << "Enter a number in [" << min << ", " << max << "]" << endl;
cin.clear(); // unset failbit
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip bad input
}
} while (!valid);
return result;
}