• ベストアンサー

時間以外にもあるのでしょうか?

本日からプログラム(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; } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・実行するたびに異なる数字を出力したかったので今回は「時間」を使いましたが、「時間」以外に使えるものはないのでしょうか? (「日付」「年」などでもいけそうなのですが、短時間に数回実行する場合は同じ結果がでそうです) 短時間に数回実行しても異なる数字を出力できるものをおねがいします。 ・「時間」の場合、日本ではすべての人が同じ時間を共有しているので同じタイミングで実行した場合は同じ結果がでるのでしょうか? 以上二点ですが回答をおねがいします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

そうそう, 「普通の C の範囲で使えることが確実」な乱数の種は時刻くらいしかないはずです. 言い換えれば「OS などの処理系を限定すれば他のものを使えるかもしれない」ということになります. 例えば今どきの Unix 系の OS なら /dev/random くらいあっても不思議ではありませんし, システムによっては物理乱数生成器を持っているかもしれません. でこの質問に関していえば「処理系がわからない以上『時刻』しか言いようがない」ということで.

ricore
質問者

お礼

理解しました^^ 処理系が分からない以上「時刻」しかないんですか。 でも全然「時間」だけでも困ることはないんですよね。 ご教授ありがとうございました。

その他の回答 (4)

  • TinyPine
  • ベストアンサー率30% (719/2386)
回答No.4

No.1です。 GetTickTimeで取れるのはミリ秒です。 ただ、ダブルワードなので、int変換して下さい。 そして適当な桁数を抜き出せば乱数のシードに使えるのでは無いでしょか。

ricore
質問者

お礼

msはマイクロ秒 GetTickTimeはミリ秒ですか・・・ なんかすごいです。。桁が^^; 乱数は時間を使うのがやはり一般的みたいです。 ご教授感謝します。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

>>msの下何桁か使ってみてはいかがですか。 >これはマイクロソフトのプロダクトKEY下何桁かを使うという事でしょうか? おそらくANo.1の方は「micro sec.(マイクロ秒)」の意味で使われたと思われます。Microsoftは通常大文字表記(MS)にしますので。

ricore
質問者

お礼

なるほどです。 Microsoftは大文字なんですね 覚えておきます。 ご教授ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

後半だけ: この場合の「時刻」というのは「その PC における時刻」を意味します. ですから, 「全く同時に実行した」としても, 「同じ時刻になる」とは限りません. 普通の時計でも, ちゃんと時刻を合わせておかないと「同じ時刻」を指さないのと同じ.

ricore
質問者

お礼

やはりそうですか・・・^^; 最初の設定の時に時間あわせしますし、偽ることは可能ですよね。 ただ、もし 同じ時間を共有できており同じタイミングで起動すると同じ数値がでるんでしょうね。 おくが深いです。。

  • TinyPine
  • ベストアンサー率30% (719/2386)
回答No.1

msの下何桁か使ってみてはいかがですか。 後、秒 DWORD dWrk = GetTickTime();

ricore
質問者

お礼

>>msの下何桁か使ってみてはいかがですか。 これはマイクロソフトのプロダクトKEY下何桁かを使うという事でしょうか? ほぇ~そんなこともできるんですね。 これを使ったらそのPCだけの番号が割り当てることができそうです。 >>後、秒 >>DWORD dWrk = GetTickTime(); 命令文を書いていただいているので助かります^^ これはtime(NULL)とは違って59通りしかないんですね。 やはり使い分けが大事なんでしょうね。。