2

正如我在另一篇文章中看到的,关于以给定概率生成随机数,我发现了我在程序中使用的这个有用的代码:

r = rand;
prob = [0.5, 0.1, 0.4];
x = sum(r >= cumsum([0, prob]));
disp(x)

it gives

0.5 chance of 1
0.1 chance of 2
0.4 chance of 3

我已经根据我的需要调整了这个例子:我需要使用以下 proba 生成从 1 到 6 的数字:

signal5=[0.233  0.233   0.233 0.1    0.1     0.1   ];

到现在为止,一切都很完美。

当我尝试通过大量试验(1000)验证结果时,我有一两个奇怪的案例,其中 x=7 :

k=1
for k=1:1000
signal5=[0.233  0.233   0.233 0.1    0.1     0.1   ];
r = rand;
            x = sum(r >= cumsum([0, eval('signal5')]));
 fid=fopen('seed.txt','a+');
 fprintf(fid,'Trial  %s  X %s',num2str(k),num2str(x));
 fclose(fid);
k=k+1
end 

为什么我有时会 7 进行大量试用?

4

1 回答 1

1

在我们开始之前只是一个旁注:你看过这个randsample函数吗?这还允许您从分布中提取值,其中每个值都以一定的概率出现。顺便说一句,你不需要eval那里的声明。这是多余的。只需引用变量 ( signal5)。

现在来回答你的问题。当您执行此语句时:

x = sum(r >= cumsum([0, eval('signal5')]));

发生的事情是您将获得第 7 个条目,因为可能有一段时间您会生成一个随机数,1.0当您的概率总和为 时0.99。不可避免地会发生的是,当你这样做时cumsum,它会被“推”到下一个垃圾箱,这就是为什么会出现第 7 次。正如@MarkDickenson 所建议的那样,快速解决方法是丢弃第 7 个值。我可以建议的另一个解决方法是稍微更改向量开头的一个概率,使其增加0.001. 这样,您所有的概率总和为 1。例如,执行以下操作:

signal5=[0.234  0.233   0.233 0.1    0.1     0.1   ];

偏移量的重要性0.001(希望!)可以忽略不计。

于 2014-05-20T18:41:04.247 回答