生成一定概率的算法

elated 2012-01-31 10:51:43
程序中有好多功能是要一定概率成功的, 如果这样实现算法

bool Random(int range)
{
return rand() % 100 < range;
}


比如A功能90%的概率成功,B功能20%的概率成功。
如果程序逻辑第一次执行到A功能,它的概率是正确的,执行N次,也是正确的。
但如果在执行A后执行B功能,它的概率还正确么?
我明白如果把rand()生成的随机数保存起来,只供一个功能使用,那么它的结果是正确的,这没有疑问。
但这样做会增加程序是存储开销。
关于生成概率,还有什么比较好的算法么?
...全文
376 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
V68V6 2012-02-14
  • 打赏
  • 举报
回复
自己重新封装伪随机数发生函数,真正的随机数发生器恐怕要依赖于硬件.

参考
seaeyepan 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thefirstz 的回复:]

每次运行的时候改变下rand()的种子吧,或是自己实现随机数算法
[/Quote]

这是猪头想法,如果改变种子可以提高“随机性”,那么随机数生成器本身就肯定已经做了。
楼主的担忧是想多了,伪随机数生成器保证生成均匀分布的0-1小数
虽然每一个伪随机数都是根据上一个伪随机数计算出来的,但是非常难在实际使用中检测出这一点,所以才成为一个实用的伪随机数生成器。
帖子不能编辑 2012-02-08
  • 打赏
  • 举报
回复
rand()函数应该够用了, A和B同时使用也不冲突阿。
elated 2012-02-07
  • 打赏
  • 举报
回复
如果每次都生成种子,似乎是不正确的,因为这样调用rand()就只能得到随机数表里的第一个数了
Smile_Tiger 2012-02-07
  • 打赏
  • 举报
回复
srand(time(NULL))
elated 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 just_swizard 的回复:]

这功能需求,让人不得不想到网游boss装备掉落啊,哈哈~~~
MSDN的例子里也是用系统时间做种子的,可能要研究rand()实现原理了……
其实关键看行为吧,如果A,B,A+B,B+A,测试结果概率都跟预期符合就没问题了啊
[/Quote]
猜对了
just_swizard 2012-02-06
  • 打赏
  • 举报
回复
这功能需求,让人不得不想到网游boss装备掉落啊,哈哈~~~
MSDN的例子里也是用系统时间做种子的,可能要研究rand()实现原理了……
其实关键看行为吧,如果A,B,A+B,B+A,测试结果概率都跟预期符合就没问题了啊
cnmhx 2012-02-05
  • 打赏
  • 举报
回复
每次运行的时候改变下rand()的种子吧,譬如,取系统的时间生成一个数作为新种子。
昵称很不好取 2012-02-03
  • 打赏
  • 举报
回复
每次运行的时候改变下rand()的种子吧,或是自己实现随机数算法
昵称很不好取 2012-02-03
  • 打赏
  • 举报
回复
每次运行的时候改变下rand()的种子吧,或是自己实现随机数算法
yaoweijq 2012-01-31
  • 打赏
  • 举报
回复
只保存一个变量对程序开销的增加可以忽略不计
SuperLy 2012-01-31
  • 打赏
  • 举报
回复
如果rand()函数返回的是真随机数,那么执行A后执行B功能,它的概率是正确的;
但是实际上rand()函数是根据种子,返回的一组固定的“随机数”,种子相同,那么就是同一组随机数,所以肯定有影响,尤其你用的是%运算;不过一般应用都足够了,除非你要做特殊运算,需要真随机数,那只有用相关硬件才能实现。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧