在MATLAB中生成指定范围内的随机数

43

我该如何在MATLAB中生成介于13和20之间的随机数?


可能是MATLAB生成随机数的重复问题。 - Bobby
这需要更多的信息...你希望它们在[13,20]之间连续吗?区间是[13,20]还是(13,20)等等。它们应该是同等可能的吗?你有一个分布想法吗? - SecretAgentMan
9个回答

60

如果你正在寻找均匀分布的伪随机整数,请使用:

randi([13, 20])

不能让 n = 13 + (rand(1) * 7) 给出均匀分布的伪随机整数吗? - crowso
2
@user581544:除非你调用round(n),否则不会。 - zellus
3
实际上并不是这样。数值13和20将获得其他数值概率的一半。使用以下代码查看示例:hist(round(13 + (rand(1, 10000) * 7)), 8) - Evgeni Sergeev
@SecretAgentMan 这是一个均匀分布,但它在开区间(0,1)上,所以0和1永远不会出现。在MATLAB中键入help rand...“返回一个N×N矩阵,其中包含从标准均匀分布的开区间(0,1)中抽取的伪随机值。”13和20出现一半的原因更大的原因是因为round函数四舍五入到最近的整数。由于n函数的结果>13且<20,因此13和20错过了超过一半的机会。注意:我基于MATLAB R2017b提供这些信息。 - James
@James,我一定在想randn。你是对的:rand确实从U(0,1)生成。开放或封闭间隔的问题在实际上并不重要,因为生成任何数字的概率都是零(包括端点)。概率密度函数定义在闭区间[0,1]上。不确定缺乏睡眠导致我以前的评论错误。感谢您的纠正。 - SecretAgentMan


6
r = 13 + 7.*rand(100,1);

其中100,1是所需向量的大小。


1

ocw.mit.edu是一个非常有用的资源,对我帮助很大。Randi是最好的选择,但如果你喜欢数字游戏,可以尝试使用floor函数与rand配合以获得所需结果。

我画了一条数轴,算出来是

floor(rand*8) + 13

0

从区间 [a, b] 上的均匀分布中生成值。

      r = a + (b-a).*rand(100,1);

0
最佳解决方案是randint,但此函数生成整数。
您可以使用四舍五入函数与rand
  r = round(a + (b-a).*rand(m,n));

这将产生一个在a和b之间的真实随机数,输出矩阵的大小为m*n


1
randint已过时。在旧版本中,它需要通信工具箱。即使您使用旧版本,也不建议再使用此函数。 - Sardar Usama
"randi" 在指定范围内生成均匀分布的整数。 - SecretAgentMan

0
如果您想随机生成特定范围内的所有数字,则可以尝试以下代码:
r = randi([a b],1,d)

a = 起始点

b = 终点

d = 你想要生成的数字数量,但请记住d应小于或等于b-a


0
如果您需要一个介于13和20之间的浮点随机数
(20-13).*rand(1) + 13

如果您需要一个介于13和20之间的整数随机数

floor((21-13).*rand(1) + 13)

注意:通过将20替换为21来解决评论中提到的问题。该问题已被修复。

0

你也可以使用:

round(mod(rand.*max,max-1))+min

1
不在[min,max]范围内,也不是均匀分布的,这是问题隐含的意思。 - knedlsepp
取模运算通常很难预测,也很难用于生成随机数。通常很容易陷入非随机的模式中。最好只使用 rand 函数。 - patrik
为了通用性,我提到13的最小值和20的最大值(这是隐含的!也许修改问题为最小值和最大值更好)。请问您能指出结果的概率分布吗? - moksef
@patrik:我没有审查那个函数的实现。你能否解释一下为什么我们在使用模数时会错过随机模式?你进行了任何实验吗? - moksef
而且,我有一种感觉,模数在某段时间后开始重复。虽然不确定,这只是一种感觉。但是,如果正确设计,引入模数中的随机元素应该有助于防止这种情况发生。模数可以用于伪随机数生成的目的,但设计需要经过测试,并且可用于良好随机性的系数仅是一小组。从中选择一个,然后进行比例缩放会更好。此外,我想说rand已经做得相当不错了 :). - patrik
显示剩余2条评论

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