作者mp19990920 (郝渴连)
看板MATLAB
标题Re: [问题] random的问题
时间Tue Sep 3 15:46:27 2013
※ 引述《starmoon0918 (T毛很强滴)》之铭言:
: 现在在写一个random的table要喂给ROM使用
: 但之前写的table当bit数超过55之後,後面都呈现0
: 以下是我第一版本
: ------------------------------------------------------------------------------
: n0=input('index_num:');
: n1=input('bit_width:');
: outwidth = n1;
: Tini_file = fopen('table.v','w');
: for count=1:2^(n0)
: k=rand*(2^outwidth); %乱数产生
rand 所产生的是一个双精度的浮点数,
一个双精度的浮点数是由三个部分所组成,
sign bit(占1个bit)
exponent(占11个bits)
mantissa(占52个bits)
可参考:
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
也就是说只有52个bit才是您所想要的,
所以这种把浮点数乘上一个倍数来产生随机的0/1序列的写法非常不好。
: str=dec2bin(k,n1)
: fprintf(Tini_file,'%s\n',str);
: end
: ------------------------------------------------------------------------------
: 问题就是上述所说,所以要修改table的型态
: 而我想到的方式就是把所需的bit数以64为一个基准
: 切成两块以上
: -------------------- ---------- ----------
: | | | | | |
: | | | seed 1 | | seed 2 |
: | 128 bit | | | | |
: | | ====> | 64 bit | + | 64 bit |
: | | | | | |
: | | | | | |
: | | | | | |
: -------------------- ---------- ----------
: 因此对上述程式码修改
: ------------------------------------------------------------------------------
: n0=input('index_num:');
: n1=input('bit_width:');
: outwidth = n1;
: n2=n1-64; %第一区块以64bit为主,第二区块先暂时用替补bit数
: Tini_file = fopen('table.v','w');
: if n1<64
: for count=1:2^(n0)
: k=rand*(2^outwidth); %乱数产生
: str=dec2bin(k,n1)
: fprintf(Tini_file,'%s\n',str);
: end
: else
: for count=1:2^(n0)
: k=rand*(2^outwidth); %乱数产生
: str1=dec2bin(k,n2) %seed1
: j=rand*(2^(outwidth)); %乱数产生
: str2=dec2bin(j,n2) %seed2
: fprintf(Tini_file,'%s %s\n',str1,str2);
: end
: end
: 跑出来的结果的bits数为我一开始输入的n1数
: (而且有些地方还会少1~3bit)
: 并没有出现第一区块锁定64bit
: 可以请问一下是哪边有错误?
建议您可用以下的方式来产生任意大小的随机0/1方块,
nBit = 128;
nWord = 10;
myRandom = char(48*ones(nWord, nBit)); % 48 = 30H = 0的ASCII码
isOne = rand(nWord, nBit) > 0.5;
myRandom(isOne) = '1';
--
哀愁犹如雪花梢然飘落,
白雪厚积,
终究成了孤独的小结晶,
谁能融化我冰冻已久的孤寂?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.67.48.70
1F:推 H45:推这个方法 09/03 16:23