生成 plus/minus 1 个整数的伪随机序列
Generating a Pseudo-random sequence of plus/minus 1 integers
谁能帮我用 Matlab 创建一个长度为 1000 的 +-1 整数的简单伪随机序列?
即一个序列,例如
-1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
我尝试使用下面的代码,但这是范围 -1 到 1,其中包括 0 个值。我只想要 -1 和 1。谢谢
x = randi([-1 1],1000,1);
您可以尝试从 [0,1]
生成一个随机的浮点数序列,并将任何小于 0.5 的值设置为 -1,将任何大于 0.5 的值设置为 1:
x = rand(1000,1);
ind = x >= 0.5;
x(ind) = 1;
x(~ind) = -1;
我的另一个建议是使用 sign
function combined with randn
这样我们就可以生成正数和负数。 sign
生成的值可能是 -1、0、1,具体取决于输入的符号。如果输入为负,则输出为 -1,正时为 +1,0 时为 0。您可以额外检查输出为 0 的任何值,将它们设置为 -1 或 1:
x = sign(randn(1000,1));
x(x == 0) = 1;
还有一个(受 Luis Mendo 启发)将有一个 [-1,1]
的向量并使用 randi
生成 1 或 2 的序列,然后使用它并采样到该向量中:
vec = [-1 1];
x = vec(randi(numel(vec), 1000, 1));
此代码可以扩展,其中 vec
可以是您想要的任何内容,我们可以从 vec
中的任何元素进行采样以生成随机值序列(Luis Mendo 的观察。谢谢!).
一些备选方案:
x = 2*randi(2, 1000, 1)-3; %// generate 1 and 2 values, and transform to -1 and 1
x = 2*(rand(1, 1000, 1)<=.5)-1; %// similar to Rayryeng's answer but in one step
x = randsample([-1 1], 1000, true); %// sample with replacement from the set [-1 1]
感谢您提供这么多有用的答案。我认为这个主题可能足够笼统,值得比较。
在我的设置中(Windows8.4 x64 i74820k cpu 和 R2014a)最快的版本始终是:
x=2*round(rand(L,1))-1;
比最慢的解决方案快半个数量级。希望这有帮助。
比较:
figure comparing execution times for pseudo-random sign generation
代码:
L=[];
for expon=0:6
for mant=1:9
L=cat(1,L,mant*power(10,expon));
end
end
clear expon mant
t1=zeros(length(L),1);
x=2*round(rand(L(1),1))-1;
for li=1:length(L)
tic,
x=2*round(rand(L(li),1))-1;
t1(li)=toc;
end
t2=zeros(length(L),1);
x=(rand(L(1),1)>0.5)*2-1;
for li=1:length(L)
tic,
x=(rand(L(li),1)>0.5)*2-1;
t2(li)=toc;
end
t3=zeros(length(L),1);
x=(randi([0,1],L(1),1)>0.5)*2-1;
for li=1:length(L)
tic,
x=(randi([0,1],L(li),1)>0.5)*2-1;
t3(li)=toc;
end
t4=zeros(length(L),1);
x=rand(L(1),1);ind=x>=0.5;x(ind)=1;x(~ind)=-1;
for li=1:length(L)
tic,
x=rand(L(li),1);
ind=x>=0.5;
x(ind)=1;
x(~ind)=-1;
t4(li)=toc;
end
t5=zeros(length(L),1);
x=sign(randn(L(1),1));
for li=1:length(L)
tic,
x=sign(randn(L(li),1));
x(x==0)=1;
t5(li)=toc;
end
t6=zeros(length(L),1);
vec = [-1 1];
x=vec(randi(numel(vec),L(1),1));
for li=1:length(L)
tic,
x=vec(randi(numel(vec),L(li),1));
t6(li)=toc;
end
t7=zeros(length(L),1);
x=2*randi(2,L(1),1)-3;
for li=1:length(L)
tic,
x=2*randi(2,L(li),1)-3;
t7(li)=toc;
end
t8=zeros(length(L),1);
x=randsample([-1 1],L(1),true);
for li=1:length(L)
tic,
x=randsample([-1 1],L(li),true);
t8(li)=toc;
end
clear x vec ind li
figure,
loglog(L,[t1 t2 t3 t4 t5 t6 t7 t8],'.-','linewidth',2)
grid on
grid minor
title('Generating pseudo-random sequence +1/-1')
ylabel('Exec. Time [s]')
xlabel('Output Vector Length')
T{1}='x=2*round(rand(L(1),1))-1';
T{2}='x=(rand(L(1),1)>0.5)*2-1';
T{3}='x=(randi([0,1],L(1),1)>0.5)*2-1';
T{4}='x=rand(L(1),1);ind=x>=0.5;x(ind)=1;x(~ind)=-1';
T{5}='x=sign(randn(L(1),1))';
T{6}='vec=[-1 1];x=vec(randi(numel(vec),L(1),1))';
T{7}='x=2*randi(2,L(1),1)-3';
T{8}='x=randsample([-1 1],L(1),true)';
legend(T,'location','northwest')
只需用户 randsrc 函数。
它将生成 1 和 -1 的随机序列。
例如
out = randsrc(2,3)
输出=
-1 -1 -1
1 -1 1
x = rand(N,1);
y = sign(x-0.5);
谁能帮我用 Matlab 创建一个长度为 1000 的 +-1 整数的简单伪随机序列?
即一个序列,例如
-1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
我尝试使用下面的代码,但这是范围 -1 到 1,其中包括 0 个值。我只想要 -1 和 1。谢谢
x = randi([-1 1],1000,1);
您可以尝试从 [0,1]
生成一个随机的浮点数序列,并将任何小于 0.5 的值设置为 -1,将任何大于 0.5 的值设置为 1:
x = rand(1000,1);
ind = x >= 0.5;
x(ind) = 1;
x(~ind) = -1;
我的另一个建议是使用 sign
function combined with randn
这样我们就可以生成正数和负数。 sign
生成的值可能是 -1、0、1,具体取决于输入的符号。如果输入为负,则输出为 -1,正时为 +1,0 时为 0。您可以额外检查输出为 0 的任何值,将它们设置为 -1 或 1:
x = sign(randn(1000,1));
x(x == 0) = 1;
还有一个(受 Luis Mendo 启发)将有一个 [-1,1]
的向量并使用 randi
生成 1 或 2 的序列,然后使用它并采样到该向量中:
vec = [-1 1];
x = vec(randi(numel(vec), 1000, 1));
此代码可以扩展,其中 vec
可以是您想要的任何内容,我们可以从 vec
中的任何元素进行采样以生成随机值序列(Luis Mendo 的观察。谢谢!).
一些备选方案:
x = 2*randi(2, 1000, 1)-3; %// generate 1 and 2 values, and transform to -1 and 1
x = 2*(rand(1, 1000, 1)<=.5)-1; %// similar to Rayryeng's answer but in one step
x = randsample([-1 1], 1000, true); %// sample with replacement from the set [-1 1]
感谢您提供这么多有用的答案。我认为这个主题可能足够笼统,值得比较。
在我的设置中(Windows8.4 x64 i74820k cpu 和 R2014a)最快的版本始终是:
x=2*round(rand(L,1))-1;
比最慢的解决方案快半个数量级。希望这有帮助。
比较: figure comparing execution times for pseudo-random sign generation
代码:
L=[];
for expon=0:6
for mant=1:9
L=cat(1,L,mant*power(10,expon));
end
end
clear expon mant
t1=zeros(length(L),1);
x=2*round(rand(L(1),1))-1;
for li=1:length(L)
tic,
x=2*round(rand(L(li),1))-1;
t1(li)=toc;
end
t2=zeros(length(L),1);
x=(rand(L(1),1)>0.5)*2-1;
for li=1:length(L)
tic,
x=(rand(L(li),1)>0.5)*2-1;
t2(li)=toc;
end
t3=zeros(length(L),1);
x=(randi([0,1],L(1),1)>0.5)*2-1;
for li=1:length(L)
tic,
x=(randi([0,1],L(li),1)>0.5)*2-1;
t3(li)=toc;
end
t4=zeros(length(L),1);
x=rand(L(1),1);ind=x>=0.5;x(ind)=1;x(~ind)=-1;
for li=1:length(L)
tic,
x=rand(L(li),1);
ind=x>=0.5;
x(ind)=1;
x(~ind)=-1;
t4(li)=toc;
end
t5=zeros(length(L),1);
x=sign(randn(L(1),1));
for li=1:length(L)
tic,
x=sign(randn(L(li),1));
x(x==0)=1;
t5(li)=toc;
end
t6=zeros(length(L),1);
vec = [-1 1];
x=vec(randi(numel(vec),L(1),1));
for li=1:length(L)
tic,
x=vec(randi(numel(vec),L(li),1));
t6(li)=toc;
end
t7=zeros(length(L),1);
x=2*randi(2,L(1),1)-3;
for li=1:length(L)
tic,
x=2*randi(2,L(li),1)-3;
t7(li)=toc;
end
t8=zeros(length(L),1);
x=randsample([-1 1],L(1),true);
for li=1:length(L)
tic,
x=randsample([-1 1],L(li),true);
t8(li)=toc;
end
clear x vec ind li
figure,
loglog(L,[t1 t2 t3 t4 t5 t6 t7 t8],'.-','linewidth',2)
grid on
grid minor
title('Generating pseudo-random sequence +1/-1')
ylabel('Exec. Time [s]')
xlabel('Output Vector Length')
T{1}='x=2*round(rand(L(1),1))-1';
T{2}='x=(rand(L(1),1)>0.5)*2-1';
T{3}='x=(randi([0,1],L(1),1)>0.5)*2-1';
T{4}='x=rand(L(1),1);ind=x>=0.5;x(ind)=1;x(~ind)=-1';
T{5}='x=sign(randn(L(1),1))';
T{6}='vec=[-1 1];x=vec(randi(numel(vec),L(1),1))';
T{7}='x=2*randi(2,L(1),1)-3';
T{8}='x=randsample([-1 1],L(1),true)';
legend(T,'location','northwest')
只需用户 randsrc 函数。
它将生成 1 和 -1 的随机序列。
例如
out = randsrc(2,3)
输出=
-1 -1 -1
1 -1 1
x = rand(N,1);
y = sign(x-0.5);