请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于随机数范围的

(rangeR-rangeL+1)+rangeL  不就是rangeL到rangeR吗? 不太明白rand()%后面那个什么意思啊

正在回答 回答被采纳积分+3

1回答

liuyubobobo 2018-08-16 17:09:55

rangeR, rangeL都是具体的数,(rangeR-rangeL+1)+rangeL 得到的结果,也是一个具体的数。


rand()%返回一个0到INT_MAX之间的随机数。所以rand()%(rangeR-rangeL+1) 得到的就是一个0到rangeR-rangeL之间的随机数,rand()%(rangeR-rangeL+1)+rangeL得到的就是rangeL到rangeR之间的随机数:)

3 回复 有任何疑惑可以回复我~
  • 老师好,我不太明白为什么要 + 1,比如:
    rand()%生成的随机数是10
    rangeL 为5
    rangeR 为8
    所以我们的目标就是生成一个范围是 [5,8]的随机数
    但是10 %(8-5+1) 得到的是2
    然后再 +5 得到的是7,确实是在[5,8]之间
    然后我试了几个数,均是如此
    我的困惑是不知道为什么加 1
    有点钻牛角尖啦~
    回复 有任何疑惑可以回复我~ 2019-08-08 16:01:22
  • [5, 8] 之间一共有4个数字,5,6,7,8。[L, R]之间一共有 R - L + 1 个数字。想想看?:)
    回复 有任何疑惑可以回复我~ 2019-08-08 23:36:10
  • 谢谢波波老师,我明白了!
    我再写一遍加深一遍印象,也可以给后面的同学看。
    
    函数的目的是生成 闭区间 [rangeL, rangeR] 之间的随机数
    //      但我们一般只能生成 [0,N]之间的随机数
    //      所以就采取迂回策略
    //      1.先生成 [0, rangeR - rangeL]之间的随机数 
    (这里要注意 随机数 % M 即可生成 [0,M-1]之间的随机数,这是取余函数的性质,所以我们才要对 rangeR-rangeL+1 取余)
    //      2.再加一个偏置 rangeL, 即可变为[rangeL, rangeR] 之间的随机数了
    回复 有任何疑惑可以回复我~ 2019-08-13 16:12:24
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信