#4
by かずま » 6年前
Random r(a, b) で、r は a から bまでの乱数を保持するオブジェクトとなります。
r.get() で乱数が取得できます。全部取得し終わったあとは a-1 が返ります。
r.reset() で再取得できるようになります。
コード:
#include <iostream> // cout, endl
#include <cstdlib> // srand, rand
#include <ctime> // time
using namespace std;
class Random {
int a, n, size, *data;
public:
Random(int a, int b) : a(a), n(b-a+1), size(n), data(new int[n]) {
for (int i = 0; i < n; i++) data[i] = i;
}
~Random() { delete[] data; }
int get() {
if (n <= 0) return a - 1;
int k = rand() % n, t = data[k];
data[k] = data[--n];
return (data[n] = t) + a;
}
void reset() { n = size; }
};
int main()
{
srand(time(0));
Random r(1, 100);
for (int i = 0; i < 25; ++i) cout << ' ' << r.get();
cout << endl;
r.reset();
for (int i = 0; i < 25; ++i) cout << ' ' << r.get();
cout << endl;
}
実行結果
コード:
42 25 55 52 86 13 92 6 68 31 40 12 35 53 74 32 63 48 43 33 9 22 16 96 76
54 33 17 19 23 40 71 79 93 26 72 15 69 27 89 5 65 62 41 61 100 10 36 21 66
Random r(a, b) で、r は a から bまでの乱数を保持するオブジェクトとなります。
r.get() で乱数が取得できます。全部取得し終わったあとは a-1 が返ります。
r.reset() で再取得できるようになります。
[code]
#include <iostream> // cout, endl
#include <cstdlib> // srand, rand
#include <ctime> // time
using namespace std;
class Random {
int a, n, size, *data;
public:
Random(int a, int b) : a(a), n(b-a+1), size(n), data(new int[n]) {
for (int i = 0; i < n; i++) data[i] = i;
}
~Random() { delete[] data; }
int get() {
if (n <= 0) return a - 1;
int k = rand() % n, t = data[k];
data[k] = data[--n];
return (data[n] = t) + a;
}
void reset() { n = size; }
};
int main()
{
srand(time(0));
Random r(1, 100);
for (int i = 0; i < 25; ++i) cout << ' ' << r.get();
cout << endl;
r.reset();
for (int i = 0; i < 25; ++i) cout << ' ' << r.get();
cout << endl;
}
[/code]
実行結果
[code=text]
42 25 55 52 86 13 92 6 68 31 40 12 35 53 74 32 63 48 43 33 9 22 16 96 76
54 33 17 19 23 40 71 79 93 26 72 15 69 27 89 5 65 62 41 61 100 10 36 21 66
[/code]