生成特定二进制范围内的随机数

时间:2017-03-01 12:49:08

标签: matlab random binary

我有一个带十进制数的矩阵,我知道我可以使用以下代码将它们转换为二进制:( IEEE 754双精度二进制)

m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]);
b_recovered = reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b));

使用这段代码,我认为最后8位是最重要的位。 我想生成随机十进制数并替换这些元素,因为在替换生成的随机数后,最后8位不会改变。我需要一个新号码,同时保留最后8位。

例如:

b=-1.12;
m=1110110001010001101110000001111010000101111010111111000110111111;

替换为:

 m=0000110000000000001110000000011010000001100010000010000110111111;

等于:

b=-1.337678432804527e-04

我知道我可以在两个数字之间生成随机十进制数,但我不知道如何解决上述问题。

mymatrix(1:q,:)= value2 + (value2-value1).*rand(q,size(y_blk,2));

1 个答案:

答案 0 :(得分:1)

保留前56个替换最后8个

生成0255之间的整数,并将其转换为二进制。用它们替换序列的前8位或后8位。

b=-1.12;
m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]);
m_small = [dec2bin(randi(256)-1,8), m(9:end)]
m_large = [m(1:end-8),dec2bin(randi(256)-1,8)]
b_small = reshape(typecast(uint8(bin2dec(reshape(m_small,8,[]).')),'double'),size(b));
b_large = reshape(typecast(uint8(bin2dec(reshape(m_large,8,[]).')),'double'),size(b));

b_small的值,几乎没有变化,表明前8位是最不重要的。 b_large变化很大,因此最后8位是最重要的位。

保留最后8个替换前56个

误解了你想要保留最后8位的问题并替换其余部分。在这种情况下,生成56位随机数据​​并添加您保存的最后8位数据。现在事实证明,Matlab只能生成2^53的max int。不是生成一个最大为2^56的整数,而是生成每个2^8的7,并将它们连接起来。

m_new = [reshape(dec2bin(randi(2^8,[7,1])-1,8),[1,56]), m(end-7:end)]
b_new = reshape(typecast(uint8(bin2dec(reshape(m_new,8,[]).')),'double'),size(b));