- ベストアンサー
時間以外にもあるのでしょうか?
本日からプログラム(C)の勉強をしています。 少し疑問に思ったことがあるのでよろしければ教えてください。 起動時に1・2・3の数字を出力するものをつくりました。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ #include <stdio.h> #include <time.h> #include <stdlib.h> main () { int computer; srand(time(NULL)); computer = rand() % 3 + 1; printf("コンピューターは %d", computer); return 0; } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・実行するたびに異なる数字を出力したかったので今回は「時間」を使いましたが、「時間」以外に使えるものはないのでしょうか? (「日付」「年」などでもいけそうなのですが、短時間に数回実行する場合は同じ結果がでそうです) 短時間に数回実行しても異なる数字を出力できるものをおねがいします。 ・「時間」の場合、日本ではすべての人が同じ時間を共有しているので同じタイミングで実行した場合は同じ結果がでるのでしょうか? 以上二点ですが回答をおねがいします。
- ricore
- お礼率68% (92/134)
- C・C++・C#
- 回答数5
- ありがとう数5
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
そうそう, 「普通の C の範囲で使えることが確実」な乱数の種は時刻くらいしかないはずです. 言い換えれば「OS などの処理系を限定すれば他のものを使えるかもしれない」ということになります. 例えば今どきの Unix 系の OS なら /dev/random くらいあっても不思議ではありませんし, システムによっては物理乱数生成器を持っているかもしれません. でこの質問に関していえば「処理系がわからない以上『時刻』しか言いようがない」ということで.
その他の回答 (4)
- TinyPine
- ベストアンサー率30% (719/2386)
No.1です。 GetTickTimeで取れるのはミリ秒です。 ただ、ダブルワードなので、int変換して下さい。 そして適当な桁数を抜き出せば乱数のシードに使えるのでは無いでしょか。
お礼
msはマイクロ秒 GetTickTimeはミリ秒ですか・・・ なんかすごいです。。桁が^^; 乱数は時間を使うのがやはり一般的みたいです。 ご教授感謝します。
- shimix
- ベストアンサー率54% (865/1590)
>>msの下何桁か使ってみてはいかがですか。 >これはマイクロソフトのプロダクトKEY下何桁かを使うという事でしょうか? おそらくANo.1の方は「micro sec.(マイクロ秒)」の意味で使われたと思われます。Microsoftは通常大文字表記(MS)にしますので。
お礼
なるほどです。 Microsoftは大文字なんですね 覚えておきます。 ご教授ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
後半だけ: この場合の「時刻」というのは「その PC における時刻」を意味します. ですから, 「全く同時に実行した」としても, 「同じ時刻になる」とは限りません. 普通の時計でも, ちゃんと時刻を合わせておかないと「同じ時刻」を指さないのと同じ.
お礼
やはりそうですか・・・^^; 最初の設定の時に時間あわせしますし、偽ることは可能ですよね。 ただ、もし 同じ時間を共有できており同じタイミングで起動すると同じ数値がでるんでしょうね。 おくが深いです。。
- TinyPine
- ベストアンサー率30% (719/2386)
msの下何桁か使ってみてはいかがですか。 後、秒 DWORD dWrk = GetTickTime();
お礼
>>msの下何桁か使ってみてはいかがですか。 これはマイクロソフトのプロダクトKEY下何桁かを使うという事でしょうか? ほぇ~そんなこともできるんですね。 これを使ったらそのPCだけの番号が割り当てることができそうです。 >>後、秒 >>DWORD dWrk = GetTickTime(); 命令文を書いていただいているので助かります^^ これはtime(NULL)とは違って59通りしかないんですね。 やはり使い分けが大事なんでしょうね。。
関連するQ&A
- 毎回違う乱数を生成するにはどうしたらいいでしょうか
C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); return 0; } お忙しい中、教えていただけたらうれしいです。
- ベストアンサー
- その他([技術者向] コンピューター)
- 乱数発生
#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以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。
- ベストアンサー
- C・C++・C#
- 乱数について
C の入門書を1冊読み終え、簡単なプログラムを作成しようとしているのですが、 早速分からないことが出たので教えて頂ければと思います。 --------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int num; int i = 0; while( i < 4 ){ srand(time(NULL)); num = rand()%100; printf("%d\n", num); i++; } return 0; } --------------------------------------------- 上記を実行したのですが、秒数を乱数の種としているため4回とも同じ値を取得してしまいます。 より高精度に秒数を取得することは可能でしょうか? もしくはこのようなかたちで4回ともに異なる数を得ることが出来る方法がありましたら教えて頂きたいと思います。
- ベストアンサー
- C・C++・C#
- 乱数
#include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { double n,end; printf("いくつ以上の値が出たら終了しますか?:"); scanf("%lf",&end); srand((unsigned)time(NULL)); for( ; ; ){ n=(double)rand(); printf("%f\n",n); if(n>=end) break; } return 0; } これなんですが、このまま実行すると.00000になってしまいます。 自分的には0.~にしたいのですが、どう変えればいいでしょうか? 回答お願いします。
- 締切済み
- C・C++・C#
- 乱数について
Visual Studio2008を使っています。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i; srand(time(NULL)); i=rand(); printf("%d\n",i); return 0; } 乱数を作るために上のようなプログラミングを作りました。 これを「ソリューションのビルド」すると 【warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。】 と出ます。 このまま行っても乱数が出来るのですが どうしたらいいのでしょうか? 8行目を srand(time_t(NULL)); srand((unsigned)time(NULL)); と変えればいいのでしょうか? time_tでやると乱数が同じ値しか出てきません。 教えてください。
- ベストアンサー
- C・C++・C#
- C言語でサイコロのプログラムを作ってみたのですが
まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない) →1分間実行し続けると・・・ 2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する
- ベストアンサー
- C・C++・C#
- おしえて
C言語のソースのおかしいところ教えてください。 #include <stdio.h> #include <time.h> #include <stdlib.h> main () { int computer; srand(time(NULL)); printf("【ジャンケンゲ―ム】\n"); computer = rand()%3+1; printf("コンピュータは"); if(computer ==1) { printf("グー"); } else if(computer == 2) { printf("チョキ"); } else {printf("パー"); } printf("! "); return 0; } エラーは エラー E2206 2-3.c 12: 不正な文字 ' ' (0x8140)(関数 main ) エラー E2206 2-3.c 12: 不正な文字 ' ' (0x8140)(関数 main ) とでます。
- ベストアンサー
- C・C++・C#
- それぞれの暗算にかかった時間
このプログラムは3つの数字の和を暗算させるプログラムです。 プログラムでは、10回の暗算にかかった合計時間を表示させて います。 質問としては「それぞれの回数にかかった時間をそれぞれ 表示させるにはどうすればいいのかか?」です。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int a,b,c,i,n; int num; clock_t start,end; srand(time(NULL)); printf("暗算トレーニング開始!!\n"); start=clock(); for(i=0;i<10;i++) { a=10+rand()%90; b=10+rand()%90; c=10+rand()%90; n=rand()%17; printf("%d%*s+%*s%d%*s+%*s%d:",a,n,"",n,"",b,n,"",n,"",c); do{ scanf("%d",&num); if(num==a+b+c) { break; } printf("\a違います。再入力してください。\n"); }while(1); } end=clock(); printf("%.1f秒かかりました。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }
- ベストアンサー
- C・C++・C#
お礼
理解しました^^ 処理系が分からない以上「時刻」しかないんですか。 でも全然「時間」だけでも困ることはないんですよね。 ご教授ありがとうございました。