• ベストアンサー

ランダム

こんにちは。C++の初心者で Microsoft VisualC++ 6.0 を使っています。 たとえば、0から10までのランダムの数字の足し算を 10回表示したいとき、 #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int main(){ int count = 0; int numA, numB; srand(time(0)); while(count < 10){ numA = rand() % 10 + 1; numB = rand() % 10 + 1; cout << numA << " + " << numB << " = "<< numA + numB << ndl; count++; } return 0; } が使えますよね。 それと似たように、あらかじめ用意した4つの単語を ランダムに10回表示するにはどうすればいいのでしょうか。 たとえば、 flower, car, house, book の4つをランダムに car car flower book flower house book car house car と出力したい、ということです。 よろしくお願いします!!

  • nah
  • お礼率28% (228/793)

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.4

こんにちわ。 配列を使わずにswich 文で切り分けるって、こんな感じじゃないでしょうか? コンパイルしてないので、エラーがあるかもしれませんが。 ※ include とかも省略しています。 int main() {   int count = 0;   srand(time(0));   while(count < 10) {     switch (rand() % 4) {     case 0 :       cout << "flower";       break;     case 1 :       cout << "car";       break;     case 2 :       cout << "house";       break;     default :       cout << "book";       break;     }     count++;   }   return 0; }

その他の回答 (4)

回答No.5

>「ランダムに」ということなので、私としては > numA = rand() % 10 + 1; > というものを使うのかと考えているのですが、 > この場合、numAと10+1の部分に何を入れればいいのだろう、 > と悩んでしまったわけです。 > (これってstringに使えるのでしょうか?) rand()が生成できるのは 数(int) です。 文字列(string)ではありません。 だから、rand()が生成した数を、それに対応する文字列に 変換するのはプログラマの仕事です。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 配列を使わないのであれば、switch 文で切り分けてはどうでしょう? 4 パターン程度であれば、それ程プログラムの可読性も問題に ならないと思います。

nah
質問者

補足

「ランダムに」ということなので、私としては numA = rand() % 10 + 1; というものを使うのかと考えているのですが、 この場合、numAと10+1の部分に何を入れればいいのだろう、 と悩んでしまったわけです。(これってstringに使えるのでしょうか?) switchになると、ユーザーが文字を入力しない限り 出てきませんよね。しかもcaseに対しての特定の単語が出てくると 思うのです。うーん、困りました。

回答No.2

こんにちは。 あらかじめ用意している単語を配列の中に入れて、 ランダムに出した数字を4で割った余りで、配列の番号を指定し、 文字を表示すれば出来ます。

nah
質問者

補足

配列を使わずに済む方法ってないでしょうか??

  • rewind
  • ベストアンサー率18% (11/59)
回答No.1

まず、自分なら決められた単語が4つなので、 決められた単語は、配列の中に格納します。 0~3まででランダムを数値を生成し、 出力する際に、その数値を変数の添え字として使用し実現します。 こんな感じでいかがでしょうかね。

関連するQ&A

  • Perl ランダム 0と1 かぶり

    いつもお世話になっております ご教示お願い致します。 □←0 ■←1 とします。 この0と1をランダムに5こでるようにします。 ↓ 例1) □■■□■ 例2) ■■□□□ このようにバラバラに出現させることができました。 しかし、 極稀になのですが、 □□□□□や■■■■■ とすべてかぶることがあります。 この■(1)はすべてかぶってもいいのですが、 □(0)はかぶらないでほしいのです まずそのソースが下記・・・↓ srand(time()^($$ + ($$<<15))); our $val1 = int(rand(2)); our $val2 = int(rand(2)); our $val3 = int(rand(2)); our $val4 = int(rand(2)); our $val5 = int(rand(2)); 0と1が必ずバラバラになるようにするにはどのように するのでしょう?

    • ベストアンサー
    • Perl
  • C++で乱数を重複しないように発生させる

    C++で乱数を重複しないように発生させるようにプログラムを変更しろと言われたのですが、できません。 教えていただきたいです。 #include<iostream> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; int main() { int i,n; int *p; cout<<"何個記憶しますか?"<<endl; cin>>n; p=new 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); if(p[i]==p[i]) cout<<"p["<<i<<"]の値"<<p[i]<<endl; i++; } delete[] p; return 0; }

  • 自分で作成したプログラムについて…。

    visual stdio 2013 デスクトップ版のものを使い、下に書くプログラムを作ったのですが、 visual stdio 2013では、ファイルが開けませんとなり、途中で、終了してしまうのですが、mingwでは、ちゃんとファイルが開けて、プログラムが、最後まで動作するのですが、なぜでしょうか? 原因を詳しく教えてください。また、改善方法も教えてください。 プログラム #include <iostream> #include <fstream> #include <ctime> #include <cstdlib> #include <list> #include <string> using namespace std; int main() { srand((unsigned)time(NULL)); list<string> str; char sstr[255]; int count = 0; int i; ifstream in("ttest", ios::in | ios::binary); if (!in){ cout << "入力ファイルが開けません\n"; getchar(); return 1; } while (!in.eof()){ in.getline(sstr, 255); str.push_back(sstr); count++; } i = rand() % count ; list<string>::iterator p; p = str.begin(); for (int j = 2; j <= i; j++)p++; cout << *p; cout << endl; getchar(); return 0; }

  • C言語/ランダムbeepのプログラム方法

    プログラムを書いていますが理解に苦しんでいます。 勉強し始めたばかりなのでかなりハードです。どなたか助けていただけませんか。 前に進めずにいます。 何をしたいかというと、マッチングゲームの中の一部でランダムなビープサウンドにあわせて反応して答えを返すというものです。答えられなければ点数がマイナスになります。 まず、数字をランダムに1から10の間で生成し、出た数字がある特定の数字だとビープサウンドが流れるという仕組みを考えたのですがどうでしょうか。 本当に切羽詰っています。助けてください。 // rand.cpp : Defines the entry point for the console application. // #include <stdafx.h> #include <stdlib.h> /*This header is for rand srand code)*/ int main (void) { unsigned int seed; int i,run=0; printf("Choose a level of difficulty"); scanf("%d", &seed); /*&seed is for "unsigned" int*/ printf("\n"); srand(seed); /*generate a number 0-10*/ i=1+(int) (10.0*rand()/(RAND_MAX+1.0)); /*if a number is 1, beep sound comes out*/ if(i==1) for(int j=0; j<i; j++) printf("\a"); return 0; }

  • シェルで、ランダム関数を変数に代入したい

    #!/bin/bash (1)BAR = `awk ' { printf("%d", srand()%10) }'` (2)BAR = `awk '{ print srand()%10 }'` (3)BAR = `awk '{ print int(10.0*rand()) }'` echo "$BAR" 上記のように変数にランダム関数を代入したいのですが、うまくいきません。 awk '{ print int(10*rand()) }' だけでうってみると、 2 2 8 ……… のように、延々と続いてしまい、一回で終わらないのがとても気になります。 awk ' function hoge(n){ return 1 + int(rand()*n) } { print hoge(10) } ' のように、関数をからませてもうまくいきません。 どうか、解説をお願いします。 なお、OSはLINUXのFedora10で、Tera Termを使ってクライアントから操作しています。

  • cgiでランダムにファイルを呼び出す方法

    下記、CGIにてランダムに2つのホームーページを呼び出しているのですが、インフレームなどで大量に呼び出した場合、ランダムさに欠けると感じているのですが、このコードをどのように改良すればよいでしょうか? それとも、もっと、大量の状態で実験しないと分からないものでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl my $base = './'; my @files = ('a.html', 'b.html'); my $count = @files; srand(); my $url = $base . $files[rand($count)]; print "Location: $url\n\n";

  • C++で縦の棒グラフ

    #include<iostream> #include<ctime> using namespace std; int main() { int a[7]; int k; int j; srand(time(NULL)); for(k = 0; k < 7; k++) a[k] = rand() % 10 + 1; for(k = 0; k < 7; k++){ cout << "a[" << k << "] = "; for(j = 0; j < a[k]; j++) cout << "*"; cout << "\n"; } cout << "-------------\n"; cout << "0 1 2 3 4 5 6\n"; return 0; } グラフを作ってみようと挑戦したんですけど 横の棒グラフは作ることはできたんですけど 縦の棒グラフを作ろうして、下の部分はできたんですけど その上に*をランダムの数だけ表示さす方法がわかりません。 どうしてらよいでしょうか?

  • long型のランダムな値を返す方法

    C言語について質問させて頂きます。 私は今、0以上50万以下(上限は50万以上ならどんな値でもかまいません)の範囲でランダムに整数を得たいと考えております。 #include <stdlib.h>のint rand(void)は0以上の乱数を返してくれますが、返す値はintの範囲内(?)なので、要望に合っておりません。 そこで、long型のランダムな値を得たいと思っております。 一体、どのような関数またはアルゴリズムを使えば、望むように出来るのでしょうか? 是非、お教えください。

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 0から1までの乱数(実数値)を発生させるのと、ある確率の時に処理をさせたい。

    1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 #define P 0.05 5 int main(void) 6 { 7 int abc; 8 double x; 9 srand(time(NULL)); 10 x = (double)rand()/RAND_MAX; 11 if(x > P){ 12 abc = 1; 13 } ・・・ (1)0から1までのランダムな実数値を10行目で発生させているつもりですが、あまりきざみが良くない?とこ耳にはさんだので0から1までの最もいいと思われるランダムな実数値の発生を教えてもらえないでしょうか? (2)11行目で約1/20000の確率でabcに1を代入したいのですが、上記のプログラムをどのように改良すればよろしいでしょうか? どちらか片方でもアドバイス頂ければ幸いなので、お手数ですがよろしくお願いいたします。

専門家に質問してみよう