为了账号安全,请及时绑定邮箱和手机立即绑定

srand() - 为什么只调用一次?

srand() - 为什么只调用一次?

幕布斯6054654 2019-05-24 16:23:54
srand() - 为什么只调用一次?这个问题是关于这个问题的评论 推荐的方法来初始化srand?第一条评论说srand()应该只在应用程序中调用ONCE。为什么会这样?
查看完整描述

4 回答

?
www说

TA贡献1775条经验 获得超8个赞

简短的回答:通话srand()喜欢“掷骰子”随机数发生器。也不像洗牌一样。如果有的话,更像是切割一副牌。

想想这样。 rand()从一大堆卡片开始交易,每次你打电话,它所做的就是从牌组顶部挑出下一张牌,给你价值,并将牌返回到牌组的底部。(是的,这意味着“随机”序列会在一段时间后重复出现。但这是一个非常大的套牌:通常是4,294,967,296张牌。)

此外,每一个程序运行时,卡一个全新的包从游戏商店买,卡每一个全新的包总是具有相同的序列。因此,除非你做一些特殊的事情,否则每次你的程序运行时,都会得到完全相同的“随机”数字rand()

现在,你可能会说,“好吧,那我怎么洗牌?” 答案是(至少就randsrand关注),没有洗牌甲板的一种方式。

那怎么srand办?根据我在这里建立的类比,打电话srand(n)基本上就像是说“ n从顶部切下卡牌”。但是等一下,还有一件事:它实际上需要另一个全新的套牌,并n从顶部切下卡片

所以,如果你打电话srand(n)rand()srand(n)rand(),...,用相同的n每一次,你不会只是得到一个不是非常随机序列,你就会得到相同数量的从后rand()每次。(不一定是你递给的号码srand,但rand反复使用相同的号码。)

所以,你能做的最好的就是削减甲板上一次,也就是调用srand()一次,在程序的开始,用n这相当随机的,所以你会在不同的随机发生在大甲板每次启动程序运行。

[PS是的,我知道,在现实生活中,当你购买一副全新的卡片时,它通常是有序的,而不是随机顺序。对于这里的类比,我想象你从游戏商店购买的每个牌组都是看似随机的顺序,但是与你在同一商店购买的其他牌组完全相同的看似随机的顺序。有点像他们在桥牌锦标赛中使用的相同洗牌的牌组。]


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 1906 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信