• 締切済み

2つの乱数列の生成について

C言語でプログラミングをしています. 質問ですが,以下のような2つのプログラムがあったとします. /*プログラム1*/ for(i=0;i<=100;i++){ r = rand(); /* 乱数rを用いた操作を実行 */ } /*プログラム2*/ for(i=0;i<=100;i++){ r = rand(); /* 乱数rを用いた操作を実行 */ for(j=0;j<=10;i++){ s = rand(); /* 乱数sを用いた操作を実行 */ } } 上記の2つのプログラムにおいてiの値が同じ時にrの値を同じにしたいのです. 2つの種から同時に別の乱数列を発生できるなら容易に実現できるとは思うんですが,そのような方法はあるのでしょうか. また,別の方法で実現することはできるのでしょうか. 分かる方がいらっしゃいましたら,ぜひ回答をお願いします.

みんなの回答

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.3

srand()でランダム表の読み込み開始位置が指定出来るので、 rand()の前で、 .. srand((unsigned)i); r = rand(); .. って書いてあげれば、同じ値返してくれるはず。

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

標準のrand()は使わずに、自作の関数を使うといいと思います。 乱数のアルゴリズムについては「擬似乱数」とかで検索するとよいでしょう。 rand()のソースが読めるなら、それを参考にするのもよいかと。

全文を見る
すると、全ての回答が全文表示されます。
  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.1

コードは自身で作ってもらうとして、考え方のアドバイス rに対応させた配列変数を作ってはいかがですか。 ランダムな値を格納して、あとでそれを利用することで実現できると思います。 それに、乱数関数を200回まわさなくとも半分の100回で済みます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • この値は代入できないの?

    double v0r[64]; for(i=0;i<64;i++)  v0r[i]=rand()/RAND_MAX; このようなプログラムを書いたのですが、全く値が代入されません。 どうしてなのでしょうか・・・。 stdio.NETで書いているのですが デバックありで実行で、値代入されているか確認した所 全部 v0r[0] 0.000000000000 v0r[1] 0.000000000000 v0r[2] 0.000000000000 .... と出て、 代入された時にでる赤い字になりません。 なんで0~1までの乱数が格納されないのでしょうか?

  • 一度に複数の値を取得できる乱数ってありますか?

    PHP Version 5.1.6を使っています。 例えば、1から10まで整数の中から値が重複しないように ランダムに8個選びたいような時で、自分が思いつた選び方は、 for($i=0; $i<8; $i++){ $r = rand(1, 10); $flag = false; for($j=0; $j<Count($list); $j++){ if($r == $list[$j]){ $flag = true; break; } } if($flag){ $i--; continue; } $list[] = $r; } print_r($list); なんですが、これだと効率が悪いような気がします・・・ そこで重複しないようにランダムに選べる乱数や またはそういう関数はあるのでしょうか?

    • 締切済み
    • PHP
  • 初心者の作ったプログラムの問題点を指摘ください。

    下のように、0から9までの乱数の発生回数の標準偏差を求めるプログラムを組んでみたのですが、最後のシグマの演算が無視されてしまい、0.000000と出力されてしまいます。どこがいけないのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<math.h> int main (void){ int N,i,j,r,a[10]={0,0,0,0,0,0,0,0,0,0}; double S=0; printf("How many trials?;"); scanf("%d",&N); srand((unsigned)time(NULL)); /*初期化*/ for(i=0;i<N;i=i+1) { r=(int)(rand()/(RAND_MAX +1.0)*10); /*乱数N個取得*/ a[r]=a[r]+1; } for(r=0;r<10;r=r+1){ printf("a[%d]=%d.\n",r,a[r]); S=1/10*(S+sqrt((a[r]-N/10)*(a[r]-N/10)));  /*演算(無視されてしまう・・・)*/ } printf("Sigma=%f",&S); return 0; }

  • C言語に詳しい方お願いします。break文によってループをどのように脱出できるのか等。

    質問1.自分で簡単なプログラムを作ってみて簡単な実験をしてみたのですが,break;を使うとループをすべて抜けるのではなくいくつかループがある場合『一番内側のループを抜ける』ということでいいのでしょうか? 例えば do { }while() while(){ } for(i=0;i<N;i++) のループにはすべてbreak;は通じるのでしょうか?この他にbreak;が使えるループはありますか? 2.これも自分で試しに実験してみたのですが, #define R (double)rand()/32767.0 としておいて 例えば, a=sin(R); b=a; のように使用した場合, a=sin(R)の部分では乱数が新たな値に更新されるが, b=aの部分では乱数が新たな値に更新されない感じがします。 結論:Rが見える形で含まれていれば乱数の値は更新され,Rが見えない形で含まれていると乱数の値は更新されない。 ってことでしょうか? これは#defineの部分に何か秘密があるような気がします。詳しい方回答よろしくお願いします。

  • 二つのint型配列を一つにするには?

    2種類のint型配列にそれぞれ数が重ならないように数字を代入して行きます。この2種類のプログラムの違いは値を代入する方法以外はすべて同じです。ですから、ユーザー関数で一つにまとめようと考えてます。 2種類の違い:値を代入する方法がが違う。 (1)scanf()関数で人間が値を各要素に代入する。 (2)rand()関数でPC側が値を各要素に代入する。 配列への代入のルール (1)同じ値の場合は代入しなおさなければならない。 基本的には 人間側が値を要素に代入する場合 for( i = 0 ; i < 6 ; i++){ while(1){ scanf("%d",&dut[i]); for (j = 0; j < i ; j++){ if(dut[i] == dut[j]){flg = 1; break;} } if (flg == 0){break;} } } PC側がrand()関数を使い各要素に入力した場合 for( i = 0 ; i < 6 ; i++){ while(1){ pc[i] = rand()%43 + 1; for (j = 0; j < i ; j++){ if(pc[i] == pc[j]){flg = 1; break;} } if (flg == 0){break;} } } 以上の二つの違うところは「rand()関数かscanf()」どちらかが入るだけです。あとはみな同じつづりなのです。だから一つに出来ると思うのです。 共有して使える関数はどんどんまとめちゃうのが私の考えですので。 ※ヘッダ呼び出しや、変数定義など基本的な部分は省いてあります。 間違いがあるときはおしえてください。 ※また、別の方法があるときはぜひおしえてください。

  • 乱数について

    こんばんは。 何度も申し訳ありませんが、今回は乱数について教えてください。 LinuxでCを勉強しているんですが、 randで乱数を発生させることはできたんですが、 そのプログラムを何度実行させても 出てきた乱数は同じ値なんです。 プログラム内で例えば10こ乱数を発生させたとすると 違うものが出ます。 しかし、もう一度そのプログラムをはしらせると 前回と全く同じ並びで同じ数が出るのはどうしてでしょうか? 言ってる意味わかっていただけましたでしょうか? 宜しくお願いします。

  • ソートプログラム

    前に質問したものです。慌てていたのですみません。 Cで書いた直接選択法です。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 void main( void ) { int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%1000+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; for(s=0;s<i;s++) printf("%d,\t",a[s]); } } このプログラムを実行すると、1回ずつ入れ替えされたものが出力されます。 100回、200回、・・・と入れ替えを行った値を出力するには、どうすればよいでしょうか? ループを入れてみたりしてみましたが、、?? プログラムを再帰の方法をつかって書いたほうが、、、?? よろしくお願いします。

  • コンパイルできません。

    コマンドプロンプト上で、乱数をいくつか取得するというプログラムを作成したいのですが、コンパイル出来なくて困っています。発生させる乱数を0~900までの数字の中から0~9個のうちのいずれかの個数だけ取得するようにしたいです。j< の所に変数を記述するのはダメなのでしょうか?わかる方いましたらお願いします。 import java.util.*; public class RandomTest{ int rand; public static void main(String[] args){    Random generator = new Random();    for(int i=0; i<1; i++){     int rand = (int)(Math.random() * 10);    }    for(int j=0; j<rand; j++){     int ran = (int)(Math.random() * 1000);       System.out.println(ran);    } } }

    • ベストアンサー
    • Java
  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。