質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1085閲覧

乱数の重複チェックをしたい

oruouma

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/05/28 04:06

編集2019/05/28 04:39

C++で動的な記憶域の確保をして、乱数を発生させ、各要素に数値を格納し、表示するということをしているのですが、乱数が重複してしまった際のチェックをする方法が分からないです。

```ここに言語を入力

コード

##### #include<iostream> ###### #include<cstdlib> ###### #include<cstring> ###### #include<ctime> using namespace std; int main(){ int i, n; int*p;//記憶域を扱う変数として、ポインタ*pを用意 cout << "何個記憶しますか" << endl; cin >> n; p = new int[n]; //int型n個分の記憶域を確保 //記憶域の確保に失敗した場合、メッセージを表示して終了 if (p == NULL){ cout << "記憶域の確保に失敗しました。" << endl; return 1; } srand((unsigned)time(NULL)); rand(); i = 0; while (i < n){ p[i] = 1 + (int)((double)rand() / (RAND_MAX + 1.0) * 75); cout << "p[" << i << "]の値" << p[i] << endl; i++; } delete[] p; return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q71

2019/05/28 04:45

何がわからないのでしょうか。 配列に入れているのだから、例えば3つ目の乱数なら、「配列の0、1の要素と比べる」と、重複したかどうかわかりますよね。
mather

2019/05/28 04:47

コードブロックを正しく使用してください。
mather

2019/05/28 04:50

> 乱数が重複してしまった際のチェックをする 「チェックをする」とありますが、重複した場合に具体的にはどうするのか?という基本的なことがそもそも書かれてないです。
oruouma

2019/05/28 04:54

すいません。もう少し自分で考えてみます。
oruouma

2019/05/28 05:31

重複していた場合、その値を表示させないコードが知りたいです。
guest

回答2

0

こんにちは。

重複しない乱数は結構需要が多いようで、ここにも多数のQAがあります。

基本は、初期値から始めて必ず増加する値を配列に格納し、その配列をシャッフルすることで重複しない乱数列を得ることができます。適切なシャッフル・アルゴリズムを選択すれば偏りも発生しにくくなります。

投稿2019/05/28 07:45

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oruouma

2019/05/28 15:40

丁寧に教えてくださり、ありがとうございます。
guest

0

ベストアンサー

愚直にコードを書くならこうじゃないでしょうか。(あくまでチェックするだけのコード)

i = 0; while (i < n){    p[i] = 1 + (int)((double)rand() / (RAND_MAX + 1.0) * 75);        /*新たに作った乱数と今までに作った乱数を比較*/    for(int j = 0;j < i;j++){ if (p[i] == p[j]){ cout << "乱数が重複しています" << endl; } }    cout << "p[" << i << "]の値" << p[i] << endl;    i++; }

投稿2019/05/28 05:35

amahara_waya

総合スコア1029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問