[delphi-users:0635] Re: Random関数について

0 views
Skip to first unread message

kita3

unread,
Jul 23, 2009, 8:42:20 PM7/23/09
to delphi...@freeml.com
こんにちは kitamuraです。

Randomize は乱数を初期化しますので、
> Randomize;
>
> a:=Random(256);
と続けて使用すると同じ乱数が出てきます。

OnCreateでRandomizeしてボタンのイベントでRandom(256)を使うと
ボタンを押すたびに違う値が出てきますよ。

以上、よろしくお願いします。

【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆
http://ad.freeml.com/cgi-bin/sa.cgi?id=eztfD
------------------------------------------------------------------[PR]--
■GMO INTERNET GROUP■ GMO INTERNET www.gmo.jp

高木太郎

unread,
Jul 23, 2009, 8:42:27 PM7/23/09
to delphi...@freeml.com
 こんにちは、イマジオムの高木です。

knockwoodさん:
> 下記のようにすれば1~256の間の任意の数字が取得できると思って
> いたのですが、これですと、ボタンを押すたび毎回同じ数字が取得されて
> しまうようです。
>
> procedure TMainForm.Button1Click(Sender: TObject);
> var
> a:integer;
> begin
> Randomize;
>
> a:=Random(256);
> end;

 Randomize は、プログラムの開始時に1回だけ呼び出してください。

 Random は、内部状態を表す整数型のグローバル変数を参照・変更することに
より、毎回異なる値を返す動作を実現しています。 このグローバル変数は、
初期状態では0となっており、そのままではプログラムを開始してから毎回
同じ乱数列が現れることになってしまいます。 Randomize は、この問題を
回避するための手続きであり、グローバル変数に現在時刻を変換して得た
値を代入することで、プログラムを開始してからの乱数列を実行回数ごとに
変える働きをします。 このような動作のため、ほとんど同じ時刻に複数回
Randomize を呼び出すと、それらはグローバル変数に同じ値を代入するため、
直後の Random 関数も同じ値を返すようになってしまいます。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=eztfL

knockwood

unread,
Jul 23, 2009, 8:28:49 PM7/23/09
to delphi...@freeml.com
初歩的なことですみません。knockwoodです。

私がRandom関数の仕様を勘違いしているのかもしれませんが、
質問させてください。

ヘルプを読んだ上での私の理解では、下記のようにすれば1~256の
間の任意の数字が取得できると思っていたのですが、これですと、
ボタンを押すたび毎回同じ数字が取得されてしまうようです。

procedure TMainForm.Button1Click(Sender: TObject);
var
a:integer;
begin
Randomize;

a:=Random(256);
end;


何か間違っているか、私が仕様を勘違いしているかだと思うのですが、
上記コードで、a に毎回違う数字がランダムに入るようにするには
どのようにしたらよいのでしょうか?
ちなみにDelphi6です。

よろしくお願いいたします。


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=ezsXr

knockwood

unread,
Jul 23, 2009, 9:43:28 PM7/23/09
to delphi...@freeml.com

kitamura様、高木太郎 様、

レスありがとうございました。

私の書き方が質問用にまとめて書いたため悪かったのですが、実は
RandomizeはFormCreate時に1回だけ書いています。

それで、実際のコードはこんな感じなんです。

procedure TMainForm.Button1Click(Sender: TObject);
var
a:integer;
begin

a:=Random(256);

  {この部分に別なコードが続く}

end;

これは昔何かを参考に作ったコードで記憶が薄れてしまっていたのですが、
それでもう一度読み返してみたら、この後に続くコードで「RandSeed」を使って
いました。これが原因で最初の一回はaにランダムな数字が入っても
その後に、何度このボタンを押してもaには同じ数字が入ってきてしまう
のかと思いました。

ただ、このRandSeedを使う部分はそのまま残しておきたいのですが、
最初のaの値だけはいつもランダムな数字が入るようにというのは
できないのでしょうか?
一度RandSeedを実行するとプログラムを終了しない限り、aには同じ
値がいつも入るみたいです。


PS.すみません、都合で後半のコードが掲載できませんが、方法とか
ありましたら、お願い致します。


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
〓〓〓〓〓皆さんは生命保険にどれくらいのお金をかけてますか?〓〓〓〓〓
案外、商品内容をよく理解せずに多額のお金を支払っている人が多いのでは。
なぜ?そういことになるかと言うと“生命保険の仕組み”が複雑すぎるから。
▼▽▼そんな日本の生命保険に「風穴」を開けようとする会社が登場した!!
http://ad.freeml.com/cgi-bin/sa.cgi?id=eztHl

しんさん

unread,
Jul 23, 2009, 9:43:58 PM7/23/09
to delphi...@freeml.com
石井@アイプラスワンです。

> ヘルプを読んだ上での私の理解では、下記のようにすれば1~256の
> 間の任意の数字が取得できると思っていたのですが、これですと、
> ボタンを押すたび毎回同じ数字が取得されてしまうようです。

どのように動作確認しているのでしょうか?
画面に表示させるために、EditBoxを配置して

> procedure TMainForm.Button1Click(Sender: TObject);
> var
> a:integer;
> begin
> Randomize;
>
> a:=Random(256);

ここに、
Edit1.Text := IntToStr(a);
のように、表示させてみれば、クリックのたびに値は変わりますよ。

> end;

--
株式会社iPLUS ONE 石井伸一
〒262-0033 千葉県千葉市花見川区幕張本郷1-16-1 日進第一ビル2F
TEL043-213-2171 FAX043-213-2172
mail:is...@iplusone.co.jp
http://www.iplusone.co.jp


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=eztH4

村の人

unread,
Jul 23, 2009, 10:06:19 PM7/23/09
to delphi...@freeml.com
knockwood様

> それでもう一度読み返してみたら、この後に続くコードで「RandSeed」を使って

RandSeedにいつも同じ値を設定していませんか?

村の人
--------------------------------------
Power up the Internet with Yahoo! Toolbar.
http://pr.mail.yahoo.co.jp/toolbar/


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆
http://ad.freeml.com/cgi-bin/sa.cgi?id=eztW5

knockwood

unread,
Jul 23, 2009, 10:16:50 PM7/23/09
to delphi...@freeml.com

村の人 <delphi...@freeml.com> 様、

> > それでもう一度読み返してみたら、この後に続くコードで「RandSeed」を使って
>
> RandSeedにいつも同じ値を設定していませんか?

はい、そうなんですが、ここは事情があって変更したくないところ
なんで、前のRandomだけいつもランダムな数字を出したいと思って
いるのですが、無理そうでしょうか?

【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=ezucu

knockwood

unread,
Jul 23, 2009, 10:50:30 PM7/23/09
to delphi...@freeml.com

すみません、自己レスです。

やはり、RandSeedを使った後は、Randomizeを呼び出すのが一番いい
みたいです。
連続的に同じような時間でボタンを押すわけではないので、押す前
にRandomizeしておけばほとんど、ランダムな数字を得られるという
ことがわかりました。お騒がせ致しました。

begin
Randomize;

a:=Random(256);

  {この部分にRandSeedを使った別なコードが続く}

end;


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆
http://ad.freeml.com/cgi-bin/sa.cgi?id=ezuwn

高木太郎

unread,
Jul 23, 2009, 11:41:04 PM7/23/09
to delphi...@freeml.com
 こんにちは、イマジオムの高木です。

knockwood さん:


> やはり、RandSeedを使った後は、Randomizeを呼び出すのが一番いい
> みたいです。
> 連続的に同じような時間でボタンを押すわけではないので、押す前
> にRandomizeしておけばほとんど、ランダムな数字を得られるという
> ことがわかりました。

 どのくらいのランダム性が必要かわかりませんが、もし Random を
呼び出す周期がほぽ一定なのだとすれば、上記の方法ではあまり良い
ランダム性が得られないことを意識しておいてください。

 RandSeed を使う部分の直前で他の変数に値をバックアップしておき、
RandSeed を使い終わったらもとに戻すのが正解でしょう。

procedure Form1Create;

begin
Randomize;
end;


procedure Button1Click;

var RandSeedOrig:LongInt;

begin
A:=Random(256);

{ A を使う処理 }

try
RandSeedOrig:=RandSeed;

{ RandSeed を使う処理 }

finally
RandSeed:=RandSeedOrig;
end;
end;

――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------


〓〓〓〓〓皆さんは生命保険にどれくらいのお金をかけてますか?〓〓〓〓〓
案外、商品内容をよく理解せずに多額のお金を支払っている人が多いのでは。
なぜ?そういことになるかと言うと“生命保険の仕組み”が複雑すぎるから。
▼▽▼そんな日本の生命保険に「風穴」を開けようとする会社が登場した!!

http://ad.freeml.com/cgi-bin/sa.cgi?id=ezuY0

knockwood

unread,
Jul 24, 2009, 2:30:23 AM7/24/09
to delphi...@freeml.com

高木太郎 <delphi...@freeml.com> 様、

さらに良さそうな方法を教えていただきましてありがとうございました。

今のところ、私の利用では大丈夫かと思っておりましたが、その方法
を参考にやってみたいと思います。

大変参考になりました。またよろしくお願いいたします。


>  どのくらいのランダム性が必要かわかりませんが、もし Random を
> 呼び出す周期がほぽ一定なのだとすれば、上記の方法ではあまり良い
> ランダム性が得られないことを意識しておいてください。
>
>  RandSeed を使う部分の直前で他の変数に値をバックアップしておき、
> RandSeed を使い終わったらもとに戻すのが正解でしょう。
>
> procedure Form1Create;
>
> begin
> Randomize;
> end;
>
>
> procedure Button1Click;
>
> var RandSeedOrig:LongInt;
>
> begin
> A:=Random(256);
>
> { A を使う処理 }
>
> try
> RandSeedOrig:=RandSeed;
>
> { RandSeed を使う処理 }
>
> finally
> RandSeed:=RandSeedOrig;
> end;
> end;

【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆
http://ad.freeml.com/cgi-bin/sa.cgi?id=ezwGH

Reply all
Reply to author
Forward
0 new messages