【问题标题】:Elegant way to create two different random integers创建两个不同随机整数的优雅方式
【发布时间】:2017-07-05 23:01:48
【问题描述】:

我想在间隔[1,n] 上创建两个随机整数,它们保证彼此不同。我觉得

ri(1)=randi([1 n]);
ri(2)=randi([1 n]);
while ri(1)==ri(2)
  ri(2)=randi([1 n]);
end

并不是你能做的最顺利的事情。

【问题讨论】:

  • p = randperm(n, k) 返回一个行向量,其中包含从 1 到 n 随机选择的 k 个 唯一 个整数。

标签: matlab random


【解决方案1】:

这是另一种方式:

ri(1) = randi([1 n]); % choose ri(1) uniformly from the set 1,...,n
ri(2) = randi([1 n-1]); % choose ri(2) uniformly from 1,...,n-1
ri(2) = ri(2) + (ri(2)>=ri(1)); % transform 1,...,n-1 into 1,...,ri(1)-1,ri(1)+1,...,n

【讨论】:

  • @LuisMendo 也感谢您的方法。这对我来说并不重要,但从数学的角度来看,这些数字不会是随机独立的,或者他们会吗?
  • @Max 数字不是独立的。他们不能,用这个或任何其他方法。由于您希望这两个数字不同,因此知道一个确实可以告诉您有关另一个的信息,因此它们不是独立的。如果不同的数字具有相同的概率,您想要(从您的代码判断)是产生所有对。这就是我的代码所做的。考虑n=7。如果ri(1) 是例如3,则第二行和第三行从124567 集合中统一选择ri(2)。我在代码中添加了一些 cmets 来澄清
  • @LuisMendo 是的,你是对的,我的意思是如果ri(2) 均匀分布在那个集合上。谢谢解释
【解决方案2】:

一种方法是使用randperm,以便生成从1n 枚举的n 值的随机排列,并且只返回结果的前两个元素:

ri = randperm(n, 2);

旧版本的 MATLAB 不支持以这种方式调用 randperm。旧版本只接受一个输入变量,默认情况下返回 n 值的整个排列。因此,您可以使用一个输入版本调用randperm,然后将其子集到最终结果中以返回您需要的内容:

ri = randperm(n);
ri = ri([1 2]);

【讨论】:

  • 没错。来自randi 上的文档:“randi 返回的数组可能包含重复的整数值。这有时称为带替换采样。要获得唯一的整数值,有时称为无替换采样,请使用 randperm (RandStream)。 "
  • @Max 完全不用担心。我什至没有看文档......我只是从经验中知道:)
  • @Max 如果你想包含0's 然后去vec = randperm(n+1, 2) vec = vec-1;
  • @TonyTannous 是的,但最初的问题只在1n 之间提出。不过很好的解决方法。
  • 好主意!我会想到使用randperm
【解决方案3】:

使用randperm 在 1...n 范围内创建两个唯一值

out = randperm(n, 2)
out(1) = number 1
out(2) = number 2

如果您希望在您的范围内包含 0。那么:

out = randperm(n+1, 2);
out = out-1;
out(1) = number 1
out(2) = number 2

【讨论】:

  • @rayryeng,真的...我来自C 世界,起始索引为0 :)
  • @tonytannous 感谢您的回答以及其他信息。我会接受雷的解决方案,因为他先发帖,但你得到了我的支持;)
  • @Max :) 乐于助人。是的,他的回答还解释了randperm 在幕后的工作方式。我只是跳过了那部分:D
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2014-11-03
  • 2012-02-20
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多