算法苦逼又来求解决方案,一个很简单的问题,大牛们来啊

2013-08-03 10:29:08 +08:00
 iloveyou
从a、b、c中随机挑出一个,a出现的几率为20%,b出现的记录为50%,c出现的几率为70%。
求最简洁效率最高的算法,最好用php。
3824 次点击
所在节点    问与答
19 条回复
dndx
2013-08-03 10:30:58 +08:00
70 + 50 + 20 > 100

这如何实现?
iloahz
2013-08-03 10:32:02 +08:00
r = rand() % 100;
if r < 20:
return a
else if r < 70:
return b
else:
return c
wang2191195
2013-08-03 10:36:43 +08:00
这个要求太高了=_=
iloveyou
2013-08-03 10:37:39 +08:00
@dndx 你可以把百分比理解为权重,就是出现的几率有多大
iloveyou
2013-08-03 10:46:07 +08:00
@iloahz 你这不对,如果a b的权重一样呢
rwx
2013-08-03 10:56:24 +08:00
自己都说是权重了,那就按权重来办啊
总权重=20+50+70
取一个 1 到总权重的随机数
看随机数落到哪个权重范围就选哪个
iloveyou
2013-08-03 10:57:18 +08:00
@rwx 我目前就是这个思路,但是代码很繁琐。求最优解
binux
2013-08-03 11:01:57 +08:00
@iloveyou 2L是对的(虽然他没想到你概率加起来不是100%)
iloveyou
2013-08-03 11:05:11 +08:00
@binux 如果有权重一样的呢
binux
2013-08-03 11:09:40 +08:00
@iloveyou 你没看到b的条件是a+b吗?
windywinter
2013-08-03 11:11:47 +08:00
把2L的% 100改成%140就对了。
iloveyou
2013-08-03 11:16:16 +08:00
@binux 恩 sorry,没注意,2楼和6楼思路一样,我也是这样想的,看来只有这种解了。
binux
2013-08-03 11:18:25 +08:00
@iloveyou 你自己写过你会注意不到?
iloveyou
2013-08-03 11:36:40 +08:00
@binux 我的情况更复杂,所以代码也和2楼不一样,所以没仔细看
jjplay
2013-08-03 11:48:27 +08:00
我觉得你是体彩中心新招聘的程序员!!!!!!!!!
Mutoo
2013-08-03 11:59:58 +08:00
你需要《代码大全》第12章,表驱动法。

不需要有百分数表示,用整数就好。
1) 先求合sum
2) 产生0~sum之间的随机数
3) sum依次减去各个权重,直到sum为负数,被减的那个就是被抽中的

这个算法要求每次减的顺序是一致的,这样才可以保证概率。
其实就是把古典概型(权数)转化成几何概型(一维长度)
best1a
2013-08-03 18:14:42 +08:00
@Mutoo +1,遗传算法中貌似把这叫做轮盘赌选择法
zuroc
2013-08-03 19:16:32 +08:00
justfindu
2013-08-05 09:03:09 +08:00
http://www.helloweba.com/view-blog-216.html

类似于这种?

表示不会贴代码~

只是这个示例里面有一个转盘范围 min和max , v表示权重或者叫做概率~ 然后就可以抽奖了~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77841

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX