乱数でー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;
}
乱数の作り方
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 乱数の作り方
どう間違っているかは一目で分かったのですが、こう考えてしまった根本を直してもらったほうが良い気がしました。
どういう順位で演算されるか分解してみてもらえますか?
これとこれを引いて、この値をこっちの値で割ってとか説明をお願いします。
どういう順位で演算されるか分解してみてもらえますか?
これとこれを引いて、この値をこっちの値で割ってとか説明をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 乱数の作り方
a=rand() -999+%1999;
aにー999を入れる
a=-999になる
-999のaに0~1998の乱数を入れる
そうすると
乱数が0のとき -999+0=-999
乱数が1998のとき -999+1998=999
よってー999~999の乱数が作れる
と考えました。
aにー999を入れる
a=-999になる
-999のaに0~1998の乱数を入れる
そうすると
乱数が0のとき -999+0=-999
乱数が1998のとき -999+1998=999
よってー999~999の乱数が作れる
と考えました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 乱数の作り方
考えとしては間違っていないですね。
ただ、C言語の式としては大きく間違っています。
書かれたとおりに記述すると
a = -999;
a = a + (rand() % 1999);
となります。
これをひとまとめにしもて
a=rand() -999+%1999;
とはなりません。
演算順位を当てにせず、演算してもらいたい順位で
a=rand() -999+%1999;
をカッコを使って書きなおしてみてください。
問題点がわかると思います。
例: a = b + 10 / 10; をカッコを使って書くと掛け算割り算が先に計算されるので a = b + (10 / 10);となります。
ただ、C言語の式としては大きく間違っています。
書かれたとおりに記述すると
a = -999;
a = a + (rand() % 1999);
となります。
これをひとまとめにしもて
a=rand() -999+%1999;
とはなりません。
演算順位を当てにせず、演算してもらいたい順位で
a=rand() -999+%1999;
をカッコを使って書きなおしてみてください。
問題点がわかると思います。
例: a = b + 10 / 10; をカッコを使って書くと掛け算割り算が先に計算されるので a = b + (10 / 10);となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 乱数の作り方
a=rand() -999+%1999;
↓
(a=-999)+rand() %1999;
(a=-999)
aに-999を代入する
+rand() %1999;
aに1998までの乱数を入れる
で、いいのでしょうか?
↓
(a=-999)+rand() %1999;
(a=-999)
aに-999を代入する
+rand() %1999;
aに1998までの乱数を入れる
で、いいのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 乱数の作り方
試してみると分かりますが、
(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に代入する式を考えてみてください。
(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に代入する式を考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 乱数の作り方
えーと
簡単に
a-=999+GetRand(1998)
でいいのではないのでしょうか?
あくまで個人的な意見ですので、あしからず
追記:
ああ、すみません
int a=0
が定義されてましたね。。(赤の部分を変更しました)
簡単に
a-=999+GetRand(1998)
でいいのではないのでしょうか?
あくまで個人的な意見ですので、あしからず
追記:
ああ、すみません
int a=0
が定義されてましたね。。(赤の部分を変更しました)
Re: 乱数の作り方
>a-=999+GetRand(1998)
それだと
a = a-(999+GetRand(1998))
になります。
それだと
a = a-(999+GetRand(1998))
になります。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 乱数の作り方
GetRand(int)ってDXライブラリの関数なんでDXライブラリ入れてなかったら使えないんじゃ・・・Wpa さんが書きました: a-=999+GetRand(1998)
もう括弧、いらないのだが。ゲスト さんが書きました: a=(-999+rand() %1999);
(ゲストさんってイズミさんでしょうか?)
Re: 乱数の作り方
確かにそうでした。失礼いたしました(_ _)ヾペコリbitter_fox さんが書きました:GetRand(int)ってDXライブラリの関数なんでDXライブラリ入れてなかったら使えないんじゃ・・・Wpa さんが書きました: a-=999+GetRand(1998)
それに、この式じゃあ数字になりませんね(文字的な意味で)
a-=999+rang(1998)
ではどうですか?