
1 mengzhuo 2014-11-03 10:49:51 +08:00 |
2 robbielj 2014-11-03 10:53:23 +08:00 via iPhone 最简单的说可以抽两次吧 先分成[1,2]和剩下的, 第一次random两个组,都是0.5 第二次在组内random |
4 andyzhshg 2014-11-03 10:56:16 +08:00 构造一个数组,里边1,2各25个,3,4,5,6,7各10个(不一定必须是25,10,可取最小整数倍,比如5和2),然后就继续用你说的算法就行了...不过我这办法看起来很矬的样子... |
5 CtrlSpace 2014-11-03 10:58:04 +08:00 via Android 一个笨方法。 弄一个长数组,按比例存放要抽取的数据,然后随机抽取数组下标。 |
6 staticor 2014-11-03 10:58:42 +08:00 加一个权重的字典 |
8 guotie 2014-11-03 11:02:58 +08:00 4楼的方法是最快的。 |
9 lichao 2014-11-03 11:03:16 +08:00 思路: i = nextInt(1..100) case i when 1..25 then 1 when 26..50 then 2 when 51..60 then 3 when 61..70 then 4 when 71..80 then 5 when 81..90 then 6 when 91..100 then 7 |
10 whywhy36 2014-11-03 11:05:08 +08:00 sorry, no Chinese Input Method :-( 1. init one mapping according to the probability 1-25 -> 0 26-50 -> 1 51-60 -> 2 ... 2. Random.nextInt(100) 3. pick the index from the mapping 4. get the number ... |
12 yxz00 2014-11-03 11:20:19 +08:00 如果精度要求不是很高,四楼的方法不错 |
13 khowarizmi 2014-11-03 11:50:53 +08:00 发现跟楼上的思路重复了,但还是写一下吧.(仅仅针对lz给的例子) p = Math.random() if 0 < p < 0.25 x = 1 if 0.25 < p < 0.5 x = 2 .... |
14 delphiqin 2014-11-03 12:30:51 +08:00 |
15 delphiqin 2014-11-03 12:33:08 +08:00 |
16 hahastudio 2014-11-03 12:35:43 +08:00 |
17 xiaoxiaoming 2014-11-03 13:45:16 +08:00 可以用一个 类似 轮盘转法,命中率就是长度 或者是面积 |
18 jokester 2014-11-03 14:34:58 +08:00 Weighted random sampling with a reservoir 这篇论文给出了一个保证one-pass的算法 |
19 feiyuanqiu 2014-11-03 14:36:54 +08:00 php: function rand_weight($numbers) { $total = 0; $dist = array(); foreach ($numbers as $num => $weight) { $total += $weight; $dist[$num] = $total; } $rand = mt_rand(0, $total - 1); foreach ($dist as $num => $weights) { if ($rand < $weights) { return $num; } } } |
20 feiyuanqiu 2014-11-03 14:44:50 +08:00 使用: $a = array( 'this' => 10, // 50% 'is' => 2, // 10% 'a' => 5, // 25% 'test' => 3, // 15% ); $result = array(); for ($i=0; $i < 100; $i++) { $result[] = rand_weight($a); } print_r(array_count_values($result));exit; // 结果: Array ( [a] => 24 [this] => 50 [is] => 8 [test] => 18 ) |
22 zoowii 2014-11-03 14:47:31 +08:00 生成一个[0, 1)的小数,然后按权重分配这段长为1的线段.然后看这个随机生成的小数在哪个区间即可 |
23 bingwenshi 2014-11-03 14:51:20 +08:00 |
24 bingwenshi 2014-11-03 14:56:11 +08:00 方法不一定比楼上各位的好, 但是思路会比较清晰点 |
25 lygmqkl 2014-11-03 16:08:43 +08:00 @lichao 这个方法好,不局限在目标array,跳出来构建一个概率数组,然后根据概率数组获得的值直接取整对应到目标array |
26 walleL 2014-11-03 20:20:26 +08:00 圆桌算法 代码参考 @feiyuanqiu 的 游戏里面经常用到 |
27 xiaowangge 2014-11-03 22:18:34 +08:00 via Android 游戏开发用到的是,填写成配置文件。 |
28 yangzh 2015-03-05 01:31:03 +08:00 via iPhone 已知了概率分布的概率累积函数 F(x),也可以从均匀分布 U[0,1] 中随机取 u ,再求 x=F^(-1)(u) ,x 即是想要随机样本。 此为统计学上的标准答案。建议楼主找个周围学过概率学的朋友问问。 |