如何带有种子随机抽取数据?

3

我希望能够在随机数生成过程中种子,从一个包含数字和NaN的有限集合中随机选择元素。

目前我可以在不种子的情况下使其工作:

data = [0, 1, 2, 3, 4, 5, nan];
sample = datasample(data, 50);

但如果我想种植数字生成:

seed = rng(100);
sample = datasample(seed, data, 50);

I get the following error:

Error using datasample (line 89)
Sample size K must be a non-negative integer.

即使 datasample 的语法是 (*):
[y,...] = datasample(s,data,k,...)

我也尝试使用randsample,但是结果相似。
(*) https://it.mathworks.com/help/stats/datasample.html
1个回答

4
文档对第一个输入并不是非常明确。你需要将RandStream对象作为第一个输入参数传递,而不是rng生成的struct(顺便提一下,rng的输出是前一个设置,而不是设置)。
这里是你似乎想要做的等效操作。
stream = RandStream('mt19937ar', 'Seed', 100);
output = datasample(stream, data, k);

如果您想使用“rng”指定种子,可以调用“rng”,然后使用RandStream.getGlobalStream获取当前全局随机数流,然后将其传递给“datasample”。不过,这有点多余,因为如果没有提供随机数流,“datasample”将使用全局随机数流。
rng(100)
stream = RandStream.getGlobalStream();
output = datasample(stream, data, k);

对我来说,这似乎是文档中的错误。'rng'不会返回一个'RandStream'对象。'datasample'在底层调用'randi',它也只接受一个'RandStream'对象(尽管在文档中没有说明)。 - horchler
1
@horchler 是的,其他函数(如randsample)明确提到了这一点,所以可能是某种错误。 - Suever
谢谢,它完美地工作了。顺便说一下,我的最终目的是生成一个包含随机选择的数字和NaN的数组。您认为我的过程可以接受吗? - Pier Paolo
2
只要你希望获得任何数量的 NaN 是等可能的,那么它应该可以工作。你也可以使用 randi 并保留额外的整数,之后将其转换为 NaN:r = randi([0 6], 50, 1); r(r == 6) = NaN。这不需要任何工具箱。 - Suever
1
我已向MathWorks提交了一项服务请求,以报告此问题。 - horchler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接