Re: [問題] random的問題
※ 引述《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
推
09/03 16:23, , 1F
09/03 16:23, 1F
討論串 (同標題文章)