人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語で72bit列の乱数を発生させるプログラムを教えてください。中途半端なbit数なのでどう発生させるか?bit数をどう格納するかが分かりません。

●質問者: labtest
●カテゴリ:コンピュータ
✍キーワード:BIT C言語 プログラム 中途半端 乱数
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● hissssa
●15ポイント

発生の方ですが、とりあえず72bit長の乱数が出来ればいいのなら、通常の15bitの乱数を5回作成して適当にシフト・マスクすればいいのではないでしょうか。イメージ的にはこんな感じで。

( rand() | (rand()<<15) | (rand()<<30) | (rand()<<45)| (rand()<<60) ) & 0xffffffffffffffffff

もちろん、この式をそのまま記述は出来ません。C言語で72bitの整数をそのまま処理するのは不可能なので、何らかの格納方法を考えなければいけません(char配列に8bitずつ格納するとか)。その乱数をどう利用するかが決まれば格納方法も見えてくるとは思います。

◎質問者からの返答

ありがとうございます。

乱数は文字列にして利用したいと思っています。この72bitをどのように文字列に変更できますでしょうか?


2 ● ken33jp
●5ポイント

>乱数は文字列にして利用したいと思っています。この72bitをどのように文字列に変更できますでしょうか?

http://www.orchid.co.jp/computer/cschool/bin.html

2進数で表示する。

◎質問者からの返答

私の理解が正しければ、上記で紹介されているのは72bitを72桁の文字列に変更するという方法ではないでしょうか?もし私の理解が間違っていたらすみません。

そうではなくて72bitを使ってa-Z,0-9までの文字列を作りたいと思っています。


3 ● GoldenDawn
●30ポイント

単純に考えるとこんな感じかなあ。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main() {
 unsigned char r72[9] ;
 char s72[18] ;
 int i ;

 srand((unsigned) time(NULL));

 for (i = 0; i < 9; ++i) r72[i] = rand() & 0xff ;

 for (i = 0; i < 9; ++i) {
printf("%d\n", r72[i]) ;
 }

 sprintf(s72, "%0x%0x%0x%0x%0x%0x%0x%0x%0x", r72[0], r72[1], r72[2], r72[3], r72[4], r72[5], r72[6], r72[7], r72[8]) ;

 printf("%s", s72) ;
}
◎質問者からの返答

親切にコードを書いて頂きありがとうございます。私の勘違いか、私の伝え方がよくなかったか分かりませんが、私が最終的にほしいのは72bitで表現される文字列です。

s72[18]は8bitx18=144bitですよね?

r72[9]で72bitの乱数を求めつつ、なぜs72[18]に格納されているのかがよく分かりません。理由を教えてください。


4 ● GoldenDawn
●20ポイント

例えば 0xff は 1バイトに収まる数値ですが、文字列にすると 'ff' で 2文字 = 2バイト必要になるからです。

別に必要が無ければ sprintf で s72 に文字列を格納せずに printf で直接出力すれば OK です。


5 ● hissssa
●30ポイント

どうも根本的に勘違いがあるようですね。labtestさんの言われる「72bitのデータの文字列表現」はたぶん不可能です。

一般に文字コードはバイト単位で表されますが、1バイトのデータである0?255の数値すべてに文字が割り当てられているわけではありません。いわゆる英数字を表すASCIIコードは半分の0?127までしか使用していませんし、しかもそのうち31以下の数値は制御コードに割り当てられているため対応する文字はありません。また、128以上の数値は、一般的な日本語環境では「半角カナ文字」に割り当てられています。さらにSift-JISやEUCの文字コードでは特定の数値範囲を使用して2バイト文字を表現したりします。

つまり、任意の72bitの数値を文字列化するということにつき、一般的な定義はこの世に存在しません。よって、やるとしたら自前でなんらかの「数値←→文字」の変換フォーマットを作って、それに従って文字列化するしかありません。

たとえば、文字として"0"?"9"の数字と"A"?"F"の文字を使うとします。全部で16個の文字がありますので、4bitぶんの数値と一対一に対応させる事が可能です(=16進数表現)。このルールに従って数値を文字列に変換しているのがGoldenDawnさんのサンプルです。

あるいは、文字として文字として"0"?"9"/"A"?"Z"/"a"?"z"を使うとします。これは全部で62文字になりますが、中途半端なのでさらに2文字("@"と"_"とか)を加えれば全部で64文字になり、1文字当たり6bitぶんの数値を表せることになります。このフォーマットで変換処理をでっち上げれば、12文字で72bitを表す文字列を作れることになります。


そうやって、「文字と数値を対応させるフォーマット」を適当にでっち上げて、その通りの処理を作りこむ事でしか、labtestさんの言われる「数値の文字列化」は実現できません。まぁlabtestさんの意図を正確に理解できているか自信はないのですが・・・。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ