在离散化编程,特别是启发式算法编程中,经常用到随机整数列的产生,然后再对整数列进行操作和迭代。下面介绍几个常用的函数。
1.randi函数
randi函数用于产生一定范围的随机数,而且同一个随机数可以再一次出现。
比如:
randi(5,5) %生成数字为1-5的5*5的矩阵
ans =
3 1 5 1 2
1 5 1 1 5
5 2 3 2 1
1 4 5 3 3
4 1 3 5 3
randi(5,5,2) %生成数字为1-5的5*2的矩阵
ans =
4 4
2 3
2 3
4 5
3 4
randi(5) % 生成1-5的一个随机数
ans =
3
randi([-5,5],5) %生成[-5,5]大小为5*5的矩阵
ans =
-4 -4 -2 -3 4
-4 -5 -5 4 -1
3 -4 5 3 0
4 -5 -4 1 2
3 -3 5 -3 -3
2. randperm函数
randperm函数主要生成不重复数字的序列,为一维数组。主要用于一些初始解的产生。
randperm(5)
ans =
4 5 3 2 1
randperm(5,3) % 1-5的数字取出不重复的三个
ans =
4 2 5
注意:randi(5,1,3) %产生可以有重复数字的序列
ans =
4 2 4
3. rand 函数
虽然rand函数只能生成0-1的随机数,但是可以通过round,floor等取整函数转化为整数随机数。
round(rand(m)*(n-1)+1) 生成m*m矩阵,1-n
floor(rand(m)*n+1) 生成m*m矩阵,1-n
round(rand(5)*9+1)
ans =
10 4 4 3 8
6 5 4 2 3
1 10 8 7 1
3 4 8 3 5
4 7 9 4 5
floor(rand(5)*10+1)
ans =
7 6 8 10 7
4 2 6 1 1
4 5 8 6 2
3 5 6 4 3
10 8 9 3 7
4. 时间比较
比较 randi函数和rand函数同样生成5*5的矩阵,每个元素大小从1-10. 分别运行10000000次,比较其时间
tic
for i=1:10000000
randi(10,5); %Elapsed time is 14.953315 seconds.
floor(rand(5)*10+1); %Elapsed time is 9.559714 seconds.
end
toc
总结:如果需要大规模的产生随机数,使用rand还是一个不错的选择,但是对于数据量不是很大的情况,randi使用起来是很方便的选择。