C++随机数

srand(time(0))rand()天生一对,就像英语老师口中心心念念的固定搭配一样。

三个函数

rand函数就像是调用预设好的一系列数字(模板),它是伪随机数,不能做到真正的随机。我们不妨可以试一下,只调用rand()函数的话,运行结果永远是41(C++版本不同可能会有差异)。

# include <bits/stdc++.h>
int main (){
	printf("%d", rand()); 
	return 0;
}
41
--------------------------------
Process exited after 0.324 seconds with return value 0
请按任意键继续. . .

为此,就有了srand()函数,专门负责打乱模板
可是,算法存在确定性srand()函数是需要输入数据的,它会根据输入的数据来打乱模版。但是,给它一个确定的值,最后得出来值还是固定的;我们只有给它输入一个随机数,最后得出来值才是随机数。这就陷入了一个无限死循环,看来得另谋出路。


“光阴似箭,日月如梭。”、“逝者如斯夫,不舍昼夜”、······古人的智慧已经告诉了我们答案——时间不断变化的。
因此,看上去跟随机数没有一点关系的time()函数就闪亮登场了。time()得到的值只与运行时的时间有关,而且,该函数的精度很高,想“卡点”是几乎不可能的。这才是真正的名义上的随机数。
然而,既然time()函数已经几乎可以100%的做到随机数了,干嘛还要rand()函数和srand()函数?好看?高级?其实只是起到加密的作用。想想,如果你运气特别特别特别好,真就卡到点上了,那time()也就无能为力了。但是,将time()函数返回的值再输入到srand()函数里面,rand()函数再输出一个虽然确定,但却毫无相关的值,不就相当于是起到了加密的作用了吗?而密码本就是模板
当然,你若不想加密,那也可以只使用time()函数。因为它确实随机了。


限制随机数范围

想一想,对一个数字进行什么操作(运算),最后得到的值有确定的取值范围的?
这就得跟除法联系在一起了。

余数一定小于除数

那么,把原随机数放在被除数位置,除数就是我们的限制条件余数就是最终得到的结果
比如:想要得到一个0~3之间的随机整数,除数就是3+1=4:

# include <bits/stdc++.h>
int main (){
	printf("%d", time(0)%4); 
	return 0;
}

那么,想要得到一个1~4之间的随机整数呢?余数再加一就好了。

# include <bits/stdc++.h>
int main (){
	printf("%d", time(0)%4+1); 
	return 0;
}

因此,可以总结出公式:

随机数 % 范围大小(最大值 − 最小值) + 最小值 随机数\%范围大小(最大值-最小值)+最小值 随机数%范围大小(最大值最小值)+最小值
注:中文括号是解释说明的意思。

那么,如果需要的取值范围最大超过了原随机数呢?也很简单,先将原随机数加上任意一个数即可。毕竟,随机数加上一个数后,还是一个随机数。


  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值