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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

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

Q&A

解決済

2回答

3054閲覧

<C++>ランダム・組み合わせ

tkz

総合スコア29

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

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

0グッド

0クリップ

投稿2016/02/27 08:14

編集2016/03/03 09:05

###前提・実現したいこと
最終的に
「 ○ × △ × □ 」と出力したい。
○、△、□、はそれぞれ10個の要素から一つランダムで選んだもの(10C1)!それ三つの掛け合わせを出力したいというわけである。

ただし、○、△、□、には文字を入れたい!

###発生している問題・エラーメッセージ
回答およびそのリンク先を参考して、乱数の発生をやってみたものの、初めてでうまくできませんでした!どう修正すればよいのでしょうか?

###ソースコード
言語:C++
#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>
using namespace std;

inline void InitRand(){
srand((unsigned int)time(NULL));
}

inline int Dice(){
return rand()%6+1;
}

int main(){

char const* moji[]={"moji-retsu0", "moji-retsu1", "moji-retsu2", "moji-retsu3", "moji-retsu4", "moji-retsu5", "moji-retsu6", "moji-retsu7", "moji-retsu8", "moji-retsu9"}; int rnd0, rnd1, rnd2; InitRand(); for (rnd0=0;rnd0<10;rnd0++) cout << Dice()+Dice() <<''; for (rnd1=0;rnd1<10;rnd1++) cout << Dice()+Dice() <<''; for (rnd2=0;rnd2<10;rnd2++) cout << Dice()+Dice() <<''; cout << flush; cout << moji[rnd0] << "x" << moji[rnd1] << "x" << moji[rnd2] << "\n"; return 0;

}

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

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

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

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

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

WoodenHamlet

2016/02/29 14:05

コードを書くときは </> ボタンを押してその中にコードを埋め込むとよいですよ
guest

回答2

0

ベストアンサー

こんにちは。

「10個の要素」が10個の文字の意味でしたら、下記のようにすると良いです。

まず、その10文字をchar moji[]="0123456789";のように定義します。(0~9の部分は実際に使いたい文字を書いて下さい。全角文字は使えません。半角のアルファベットと数字記号です。)
次に、3つの0~9までの乱数を生成します。int rnd0, rnd1, rnd2;に生成したと仮定します。
そして、std::cout << moji[rnd0] << "x" << moji[rnd1] << "x" << moji[rnd2] << "\n";で終わりです。
乱数の生成方法はググればたくさんでてきます。例えば、こことかですね。

もし、「10個の要素」が10個の文字列の意味でしたら、mojiの定義を下記のように変更すればOKです。
char const* moji[]={"moji-retsu0", "moji-retsu1", ..., "moji-retsu9"};
もちろん、"moji-retsu*"の部分は実際に使いたい文字列を入れて下さいね。

全角文字を使いたい時は、後者を使えばたぶんできます。(コンパイラやOSでおまじないが必要な場合がありますので、必要であればコンパイラやOSの情報も書いて別途質問して下さい。)

では、頑張って下さい。


【追記】

お疲れ様です。

シングル・クォートは文字をはさむ必要があります。文字がないのでエラーになっています。
リンク先では、' 'と間にスペースが入っていますよ。

次に、rand()関数は要するに0以上のランダムな整数を返却します。
m % nはmをnで割った余りを求めます。
つまり、`rand() % 6'は、0以上のランダムな整数を6で割った余りです。0~5になりますね?


【追記】
答えです。

C++

1#include <iostream> 2#include <string> 3#include <stdio.h> 4#include <time.h> 5using namespace std; 6 7inline void InitRand() 8{ 9 srand((unsigned int)time(NULL)); 10} 11 12inline int Dice() 13{ 14 return rand()%10; // ←ここ 15} 16 17int main() 18{ 19 char const* moji[]= 20 { 21 "moji-retsu0", 22 "moji-retsu1", 23 "moji-retsu2", 24 "moji-retsu3", 25 "moji-retsu4", 26 "moji-retsu5", 27 "moji-retsu6", 28 "moji-retsu7", 29 "moji-retsu8", 30 "moji-retsu9" 31 }; 32 int rnd0, rnd1, rnd2; 33 34 InitRand(); 35 rnd0=Dice(); // ←この辺 36 rnd1=Dice(); 37 rnd2=Dice(); 38 39 cout << moji[rnd0] << "x" << moji[rnd1] << "x" << moji[rnd2] << "\n"; 40 41 return 0; 42}

元のソースとどこが異なるのか、較べて見て下さい。マークしているところを意味的に変えてます。
(他の部分は見やすくするために変更させて頂きました。)
この差を説明する根性が足りませんでした。すいません。

投稿2016/02/27 09:48

編集2016/03/03 12:34
Chironian

総合スコア23272

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

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

tkz

2016/03/02 01:57

追記通り修正したところ、無事にエラーは解消しました。ありがとうございます。 しかし、上記のソースコードでランしても、なにも出てきません! おそらく、for文のあたり or 乱数発生 問題があると思うのですが... また、どのようにmoji-retsu0・・・に文字を代入するのですか?cinではうまくいきませんでした。
Chironian

2016/03/02 02:11

returnの後ろでmoji[]を出力してますので、moji[]は出力されません。 でも、このままでは、rnd0, rnd1, rnd2の値がmoji[]配列の要素数以上になるため、不正アクセスで落ちます。rnd0, rnd1, rnd2には0~9の値をいれるように考えてみてください。
tkz

2016/03/03 09:07

なるほど。修正してみました。for文のrnd<20のところをすべて<10にすれば良かったのでしょうか? どのように、moji-retsuを入力により代入させるですか?(cin??でも、どのように?)
Chironian

2016/03/03 12:24

長くなりそうですので、回答文に答えを追記します。
tkz

2016/03/04 04:39

できました。丁寧に教えていただきほんとにありがとうございます。
guest

0

10個の要素から3個を取り出すでいいのですよね?それなら、std::shuffleを使ってランダムに並び替えして、最初の3個を取るのが実装が一番簡単だと思います。(ただし、最速ではありません)

参考までに作りました。C++11で作成していますので、clang++でコンパイルするときは"-std=c++11"や"-std=c++14"を付けて下さい。

C++

1#include <algorithm> 2#include <iostream> 3#include <random> 4#include <string> 5#include <vector> 6 7int main() 8{ 9 // シード値には非決定的な random_device を用います。 10 // random_device は極めて低速ですが、予測は不可能な乱数です。 11 std::random_device seed; 12 // 乱数には優秀なメルセンヌツイスター mt19937 を用います。 13 // C++11以上では、特殊な事情が無い限り、メルセンヌツイスターを 14 // 使用して下さい。 15 std::mt19937 engine(seed()); 16 17 // 文字列は string を、リストは vector を用います。 18 // C++11 からは初期化子リストが使えます。 19 std::vector<std::string> moji = {"moji-retsu0", "moji-retsu1", 20 "moji-retsu2", "moji-retsu3", "moji-retsu4", 21 "moji-retsu5", "moji-retsu6", "moji-retsu7", 22 "moji-retsu8", "moji-retsu9"}; 23 24 // 一様な分布は uniform_int_distribution を使います。 25 std::uniform_int_distribution<int> dist(0, moji.size() - 1); 26 27 // あとは dist(engine) で 1 から mojiにある個数-1 までの乱数を求めて、 28 // その位置にある要素を取り出します。 29 std::cout << moji.at(dist(engine)) << "x" << moji.at(dist(engine)) 30 << "x" << moji.at(dist(engine)) << std::endl; 31 32 // 重複したくない場合は、リストを shuffle します。 33 std::shuffle(moji.begin(), moji.end(), engine); 34 // はじめの三つだけ取り出します。 35 std::cout << moji.at(0) << "x" << moji.at(1) << "x" << moji.at(2) 36 << std::endl; 37 38 return 0; 39}

投稿2016/02/27 08:43

編集2016/03/03 14:06
raccy

総合スコア21735

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問