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 1
思路:
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 即是想要随机样本。
此为统计学上的标准答案。建议楼主找个周围学过概率学的朋友问问。 |