いろいろ調べてみたら、rand()関数を使用する前に、srand()関数で乱数の種を設定するする必要があるんですね…
昨日rand()関数を使用するといつも130の数値が生成されると書きましたが、これは、srand(1)を設定している場合の乱数だったようです。
ちなみに、以下を実行してみると、確かに130が表示されました。
srand(1)をsrand(2)に変えて再び実行してみると、32682が表示されました。
一般的には、この種をそのプログラムを実行する時刻から次のように作るようです。
srand((unsigned)time(NULL))
これを設定しておけば、毎回異なる種が作られることになります。(ただし、実行する時間が短いと、同時刻となり同じ種が用いられることになる)
擬似乱数の発生方法はいろいろあるようなので、ちょっと調べてみます。
*** 「かめかめPHP」運営中 ***
昨日rand()関数を使用するといつも130の数値が生成されると書きましたが、これは、srand(1)を設定している場合の乱数だったようです。
ちなみに、以下を実行してみると、確かに130が表示されました。
#include<stdio.h>
#include<stdlib.h>
int main(){
srand(1);
printf("%d\n",rand());
} |
一般的には、この種をそのプログラムを実行する時刻から次のように作るようです。
srand((unsigned)time(NULL))
これを設定しておけば、毎回異なる種が作られることになります。(ただし、実行する時間が短いと、同時刻となり同じ種が用いられることになる)
擬似乱数の発生方法はいろいろあるようなので、ちょっと調べてみます。
↓↓↓ ヽ(^◇^*)/ ↓↓↓
|
PR
乱数を使ってみようと、rand()をプログラムに入れてコンパイルし、実行させてみると、何度やっても130の数値しか出てこない。何かで、乱数の生成パターンが決まっていると言うのを何かで、聞いたことがあったけど、こういうことか。
次の課題はこのパターンをランダムにする方法を調べること。
*** 「かめかめPHP」運営中 ***
次の課題はこのパターンをランダムにする方法を調べること。
↓↓↓ ヽ(^◇^*)/ ↓↓↓
|
ASCIIコードのアルファベットの大文字を小文字って下から6ビット目が異なるだけで、あとは同じなんですね。
A・・・01000001 Z・・・01011010
a・・・01100001 z・・・01101010
ということは、
・小文字と0010000(0x20)の排他的論理和が大文字なる。
・大文字と0010000(0x20)の論理和が小文字なる。
と言うことになります。
小文字から大文字への変換
大文字から小文字への変換
これには、ちょっと感動しました!!
*** 「かめかめPHP」運営中 ***
A・・・01000001 Z・・・01011010
a・・・01100001 z・・・01101010
ということは、
・小文字と0010000(0x20)の排他的論理和が大文字なる。
・大文字と0010000(0x20)の論理和が小文字なる。
と言うことになります。
小文字から大文字への変換
#include<stdio.h>
int main(){
char x,y;
x='a';
y = x ^ 0x20;
printf("%c\n",y);
return 0;
} |
大文字から小文字への変換
#include<stdio.h>
int main(){
char x,y;
x='A';
y = x | 0x20;
printf("%c\n",y);
return 0;
} |
これには、ちょっと感動しました!!
↓↓↓ ヽ(^◇^*)/ ↓↓↓
|
char型は1バイトの整数型。
今まであまりunsignedとsignedの違いは、それほど考えたことがなかったのですが、つい先日からビット演算について勉強していたときに、この違いの理解が必要と感じました。結論から言うと…
unsigned 0~255
signed -128~127
の違いがあるようです。
しかし、ASCII文字を扱う場合は8ビット中下位7ビットなので、unsignedでもsignedでもどっちでもいいような気がするけど…
実際にはどんな使い分けをしているんでしょうか?
どなたか、お分かりの方いたら教えてください。とにかく、char型のプログラムを組んで遊べたので、今までよりもちょっとだけ理解が深まったかな。
追記:「キャストする」っていうのは「型変換する」って言う意味に理解したけど、あっているかな?
*** 「かめかめPHP」運営中 ***
今まであまりunsignedとsignedの違いは、それほど考えたことがなかったのですが、つい先日からビット演算について勉強していたときに、この違いの理解が必要と感じました。結論から言うと…
unsigned 0~255
signed -128~127
の違いがあるようです。
しかし、ASCII文字を扱う場合は8ビット中下位7ビットなので、unsignedでもsignedでもどっちでもいいような気がするけど…
実際にはどんな使い分けをしているんでしょうか?
どなたか、お分かりの方いたら教えてください。とにかく、char型のプログラムを組んで遊べたので、今までよりもちょっとだけ理解が深まったかな。
追記:「キャストする」っていうのは「型変換する」って言う意味に理解したけど、あっているかな?
↓↓↓ ヽ(^◇^*)/ ↓↓↓
|
昨日、ビット演算を行う定数として、char型を選んでいたんだけど、なんでchar型使うんだろ?って思ったけど、ただ単純に8ビットのビット演算するためだったんですね。
ちなみに sizeof() 関数を使って char,short,int,long型 のビット幅を調べてみると、
char → 1バイト=8ビット
short → 2バイト=16ビット
int → 4バイト=32ビット
long → 4バイト=32ビット
なるほど、ビット演算のお勉強するには char型 が扱いやすいのかもしれません。しかし、今日また新たな疑問が…
変数x(=123)と定数y(=0x0f)の演算の説明で、
「定数はint型なので、変数xとの演算には符号拡張が発生する。なので、変数や定数が負になる可能性がある場合は、明確に unsigned char と定義したり、キャストすべきです。」
なる記述が…。今日はこの unsigned char やキャストの意味の理解が課題かな…。
*** 「かめかめPHP」運営中 ***
ちなみに sizeof() 関数を使って char,short,int,long型 のビット幅を調べてみると、
char → 1バイト=8ビット
short → 2バイト=16ビット
int → 4バイト=32ビット
long → 4バイト=32ビット
なるほど、ビット演算のお勉強するには char型 が扱いやすいのかもしれません。しかし、今日また新たな疑問が…
変数x(=123)と定数y(=0x0f)の演算の説明で、
「定数はint型なので、変数xとの演算には符号拡張が発生する。なので、変数や定数が負になる可能性がある場合は、明確に unsigned char と定義したり、キャストすべきです。」
なる記述が…。今日はこの unsigned char やキャストの意味の理解が課題かな…。
↓↓↓ ヽ(^◇^*)/ ↓↓↓
|
