3

我有下面的代码,我被告知我需要使用不同的种子来生成我的随机数 10 次,然后平均这些以获得更平滑的图表。我没有太多使用 Matlab 的经验,所以即使在阅读了文档之后,我也不太了解这些种子是如何工作的。

% Create an array
S = 0:20;
CW = 0:5:100;
S(1) = 0;
CW(1) = 0;

counter = 2;  % Counter for the nuber of S 
N = 20;  % Number of nodes

% Collect data for each increment of 5 up to 100 for CW values
for i = 5:5:100

    T = 10000 / i;  % Total number of cycles

    % Create array of next transmission times for N nodes
    transmission_time = floor(i * rng(1, N)); 
    total_success = 0;

    % Loop for T cycles
    for t = 1:T

        % For 0 to the number of contention windows
        for pos = 0:i-1

           % Count the number of nodes that have the current CW
            count = 0;
            for node = 1:N
               if transmission_time(node) == pos
                   count = count + 1;
               end
            end

            % If there is more than 1, then a collision occurs
            collision = false;
            if count > 1
                collision = true;
            % If there is exactly 1, then there is a success
            elseif count == 1
                total_success = total_success + 1;
            end 

            % If there is a collision, reassign new transmissions times
            if collision == true
                for node = 1:N
                    if node == pos
                        transmission_time(node) = floor(i * rand(1));
                    end
                end
            end
        end
    end

    % Display the ratio of successes
    S(counter) = total_success / (T * i);
    counter = counter + 1;
end

% Plot the graph for Success vs CW
plot(CW, S, 'o-');
xlabel('Contention Window, CW');
ylabel('Throughput, S');
4

4 回答 4

1

来自 matlab文档

生成器的频繁重新播种不会改善输出的统计特性,也不会使输出在任何实际意义上更加随机。当您重新启动 MATLAB 或运行涉及随机数的大型计算之前,重新设定种子可能很有用。但是,在会话中过于频繁地重新播种生成器并不是一个好主意,因为您的随机数的统计属性可能会受到不利影响。


您不需要使用不同的种子rand:每次运行它时它都不会生成相同的数字序列。例如

R = zeros(1e5,1);
for ii = 1:1e5
    R(ii) = rand;
end
Rsorted = sort(R);
dRsorted = diff(Rsorted);
find(dRsorted == 0)

将返回空矩阵:rand在 100,000 次连续调用中永远不会返回相同的随机数。

另外,在您的代码中,有问题。该行transmission_time = floor(i * rng(1, N));应为transmission_time = floor(i * rand(1, N));.

如果您想为每个循环使用不同的种子,您可以在第一次使用 rand 之前添加以下调用rng(i);:有了它,您将能够控制生成的随机数(rand将产生可预测的数字序列)。

于 2013-10-29T17:03:37.850 回答
1

确实,如果你有某种模拟,用相同的随机数多次运行它是没有用的。基本上有两种解决方案:

1. 非常容易,不会产生可重复的结果

在代码的开头,设置rng为基于now.

这样你每次都会得到不同的结果。

2. 简单且推荐,产生可重复的结果

将您的模拟包装在一个循环中,如果您每次按顺序执行它们,您将获得与您的模拟不同的结果(从而允许您取平均值)并且仍然可以重现结果。


请注意,通常如果您想减少模拟的波动性,您不需要多次运行它,而可以让它运行更长时间。

于 2013-10-29T17:12:30.320 回答
1

拥有单个流并简单地生成 10 倍的数据样本似乎更简单。但是,如果您想并行地从它们中提取,您可以创建 10 个具有不同种子的随机流,parfor例如可以使用 . 如果您仍在寻找一种方法来做到这一点,我知道有两种有据可查的方法:

  1. 任何流类型的多个流
  2. 'mrg32k3a'类型的子'mlfg6331_64'

多个流

从创建具有不同种子的 10 个流的元胞数组的示例开始:

s = 0:9;
r = arrayfun(@(t)RandStream('mcg16807','Seed',t),s,'uni',false); % RandStreams

使用相同的种子s将给出确定性的模拟,它总是给出相同的结果。那是,

>> r = arrayfun(@(t)RandStream('mcg16807','Seed',t),s,'uni',false);
>> r{1}.rand
ans =
          0.21895918632809
>> r{2}.rand
ans =
         0.512908935785717
>> clear r
>> r = arrayfun(@(t)RandStream('mcg16807','Seed',t),s,'uni',false);
>> r{1}.rand
ans =
          0.21895918632809
>> r{2}.rand
ans =
         0.512908935785717

RandomStream存储在元胞数组中的实例r具有以下熟悉的方法:randrandn和。该方法将启动相同的随机数序列。randirandpermreset

如果您不希望模拟是确定性的,但在某种意义上更随机,您可以通过未记录s的方法根据时间创建不同的种子向量: shuffleSeed

s = zeros(1,10);
for i=1:numel(s), s(i)=RandStream.shuffleSeed; end

并重新生成流。

子流

子流尝试在随机数流中均匀分布种子(或“检查点”)。然而,子流的真正好处据说只是易于重现。这似乎最简单,因为您只需创建一个流并在需要时切换到不同的流。例如,

>> stream = RandStream('mrg32k3a');
>> stream.get('Substream')
ans =
 1
>> samps1 = stream.rand(1,20);  % some samplesfrom substream 1

然后更改子流并获取更多样本:

>> stream.Substream = 2;
>> samps2 = stream.rand(1,20);  % some samplesfrom substream 2

但是,请注意,这仍然不能提高样本的随机性:

您不必担心在移动到下一个子流之前“用完”每个子流中的所有值,但是每次生成新值时采取另一个极端并跳转到不同的子流是没有意义的。子流不会增加随机性,它们只是让重现值变得更容易。

因此,我看不出在应用程序中使用多个随机数流/种子生成随机数的意义。

于 2013-10-29T22:19:01.123 回答
0

对不起所有的混乱。我认为你们中的一些人说我不需要生成不同的流是对的。

在上面的代码中有一行写着“if node == pos”,这是不正确的,应该是“if transmission_time(node) == pos”。

那一行是导致我的图表完全失控的原因。我还需要为成功的数据包生成新的随机数。

感谢您的所有建议!不过,我现在对 Matlab 中的种子如何处理随机性有了更多的了解!

于 2013-10-31T15:22:03.030 回答