ページ 11

乱数の作り方

Posted: 2010年11月25日(木) 21:53
by イズミ
乱数でー999~999の数字を1つ作りたいのですが、どうすれば下のコードでやると
[error c2059: 構文エラー ’%’]
と出てくるのですがどこか違うのでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int a=0;

srand(time(NULL));
a=rand() -999+%1999;

printf("%d",a);

return 0;
}

Re: 乱数の作り方

Posted: 2010年11月25日(木) 22:01
by softya(ソフト屋)
どう間違っているかは一目で分かったのですが、こう考えてしまった根本を直してもらったほうが良い気がしました。
どういう順位で演算されるか分解してみてもらえますか?
これとこれを引いて、この値をこっちの値で割ってとか説明をお願いします。

Re: 乱数の作り方

Posted: 2010年11月25日(木) 23:00
by イズミ
a=rand() -999+%1999;


aにー999を入れる
a=-999になる
-999のaに0~1998の乱数を入れる

そうすると
乱数が0のとき     -999+0=-999
乱数が1998のとき  -999+1998=999


よってー999~999の乱数が作れる
と考えました。

Re: 乱数の作り方

Posted: 2010年11月25日(木) 23:14
by softya(ソフト屋)
考えとしては間違っていないですね。
ただ、C言語の式としては大きく間違っています。

書かれたとおりに記述すると
a = -999;
a = a + (rand() % 1999);
となります。

これをひとまとめにしもて
a=rand() -999+%1999;
とはなりません。

演算順位を当てにせず、演算してもらいたい順位で
a=rand() -999+%1999;
をカッコを使って書きなおしてみてください。
問題点がわかると思います。

例: a = b + 10 / 10; をカッコを使って書くと掛け算割り算が先に計算されるので a = b + (10 / 10);となります。

Re: 乱数の作り方

Posted: 2010年11月26日(金) 00:29
by イズミ
a=rand() -999+%1999;
     ↓
(a=-999)+rand() %1999;

(a=-999)
aに-999を代入する

+rand() %1999;
aに1998までの乱数を入れる



で、いいのでしょうか?

Re: 乱数の作り方

Posted: 2010年11月26日(金) 01:13
by softya(ソフト屋)
試してみると分かりますが、
(a=-999)+rand()%1999;
だと実はaは-999にしかなりません。

演算は次のように行われるからです。
(a=-999)でaに-999が代入されます。これは意図通りですね。
で、この後の演算が問題です。
すでに代入演算は完了しているので、(a=-999)は-999と言う値と同じに扱われます。つまりaの代入はもう二度と行われません。
(a=-999)+rand()%1999;

-999+rand()%1999;
と同じなんですね。
でも代入先がないのでこの計算結果は捨てられてしまいます。
結果、求める答えが得られないって事になります。

考え方を変えて、rand()%1999 と -999の演算を先に終わらせて最後にaに代入する式を考えてみてください。

Re: 乱数の作り方

Posted: 2010年11月26日(金) 22:40
by ゲスト
a=(-999+rand() %1999);

(-999+rand() %1999);
-999に乱数をたす

上で得た値をaに入れる

Re: 乱数の作り方

Posted: 2010年11月26日(金) 23:02
by Wpa
えーと
簡単に

a-=999+GetRand(1998)

でいいのではないのでしょうか?
あくまで個人的な意見ですので、あしからず

追記:
ああ、すみません
int a=0
が定義されてましたね。。(赤の部分を変更しました)

Re: 乱数の作り方

Posted: 2010年11月26日(金) 23:25
by ゆーずぃ
>a-=999+GetRand(1998)

それだと
a = a-(999+GetRand(1998))
になります。

Re: 乱数の作り方

Posted: 2010年11月26日(金) 23:29
by bitter_fox
Wpa さんが書きました: a-=999+GetRand(1998)
GetRand(int)ってDXライブラリの関数なんでDXライブラリ入れてなかったら使えないんじゃ・・・
ゲスト さんが書きました: a=(-999+rand() %1999);
もう括弧、いらないのだが。
(ゲストさんってイズミさんでしょうか?)

Re: 乱数の作り方

Posted: 2010年11月26日(金) 23:32
by Wpa
bitter_fox さんが書きました:
Wpa さんが書きました: a-=999+GetRand(1998)
GetRand(int)ってDXライブラリの関数なんでDXライブラリ入れてなかったら使えないんじゃ・・・
確かにそうでした。失礼いたしました(_ _)ヾペコリ
それに、この式じゃあ数字になりませんね(文字的な意味で)
a-=999+rang(1998)
ではどうですか?