我需要编写random.choice的加权版本(列表中的每个元素都有不同的被选中概率).这就是我想出的:
def weightedChoice(choices):
"""Like random.choice, but each element can have a different chance of
being selected.
choices can be any iterable containing iterables with two items each.
Technically, they can have more than two items, the rest will just be
ignored. The first item is the thing being chosen, the second item is
its weight. The weights can be any numeric values, what matters is the
relative differences between them.
"""
space = {}
current = 0
for choice, weight …
Run Code Online (Sandbox Code Playgroud) 我想从数组中随机选择一个元素,但每个元素都有一个已知的选择概率.
所有机会在一起(在阵列中)总和为1.
您认为哪种算法最快,最适合大型计算?
例:
id => chance
array[
0 => 0.8
1 => 0.2
]
Run Code Online (Sandbox Code Playgroud)
对于这个伪代码,所讨论的算法应该在多个调用上统计地返回id上0
的一个元素的id 上的四个元素1
.
这个问题导致了一个新的R包:
wrswoR
没有替换使用的R的默认采样sample.int
似乎需要二次运行时间,例如,当使用从均匀分布中提取的权重时.这对于大样本量来说很慢.有人知道从R中可以使用的更快的实现吗?两个选项是"替换拒绝采样"(参见stats.sx上的这个问题)和Wong和Easton(1980)的算法(在StackOverflow答案中使用Python实现).
感谢Ben Bolker暗示C函数,该函数在被调用时sample.int
具有内部调用replace=F
和非均匀权重:ProbSampleNoReplace
.实际上,代码显示了两个嵌套for
循环(第420行random.c
).
以下是根据经验分析运行时间的代码:
library(plyr)
sample.int.test <- function(n, p) {
sample.int(2 * n, n, replace=F, prob=p); NULL }
times <- ldply(
1:7,
function(i) {
n <- 1024 * (2 ** i)
p <- runif(2 * n)
data.frame(
n=n,
user=system.time(sample.int.test(n, p), gcFirst=T)['user.self'])
},
.progress='text'
)
times
library(ggplot2)
ggplot(times, aes(x=n, y=user/n)) + geom_point() + scale_x_log10() +
ylab('Time per unit (s)') …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试编写一个在中间使用softmax激活功能的程序.
现在,我有一个这样的概率列表:
P[0.10,0.25,0.60,0.05]
Run Code Online (Sandbox Code Playgroud)
P中所有变量的总和始终为1.
考虑到附加概率,我想要一种方法来选择列表的索引.或者,换句话说,返回的函数
0 - 10% of the time
1 - 25% of the time
2 - 60% of the time
3 - 5% of the time
Run Code Online (Sandbox Code Playgroud)
我完全不知道从哪里开始.任何帮助,将不胜感激.:)
我正在研究一个模拟系统.我将很快获得实验数据(直方图),用于几个模拟输入的实际值分布.
当模拟运行时,我希望能够生成与测量分布匹配的随机值.我宁愿这样做而不存储原始直方图.有什么好方法
编辑:输入数据是几种不同类型事件的事件持续时间.我希望不同的类型具有不同的分布函数.
给定一组n
字频对:
[ (w0, f0), (w1, f1), ..., (wn-1, fn-1) ]
在哪里是一个单词,是整数频率,以及频率的总和,wi
fi
∑fi = m
我想使用伪随机数生成器(pRNG)来选择p
单词,以便选择任何单词的概率与其频率成正比:wj0, wj1, ..., wjp-1
P(wi = wjk) = P(i = jk) = fi / m
(注意,这是替换选择,因此每次都可以选择相同的单词).
到目前为止,我已经提出了三种算法:
创建一个大小数组m
,并填充它以便第一个条目,下一个条目,等等,所以最后的条目是.f0
w0
f1
w …
我正在创建一个python脚本,从这里的男性名字列表中随机选择1000个名字:http://www.census.gov/genealogy/www/data/1990surnames/names_files.html
这样做很好,花花公子,但我希望它能根据人口普查文本文件(第二栏)提供的概率列选择名称.
在过去的几个小时里,我一直试图围绕这一点,但我没有取得任何实际进展,甚至寻找其他答案.
任何人都可以帮助我或指出我正确的方向吗?提前致谢 :)
我有一个类似于的列表:
[1 2 1 4 5 2 3 2 4 5 3 1 4 2]
Run Code Online (Sandbox Code Playgroud)
我想从此列表中创建一个x随机元素列表,其中所选元素都不相同.困难的部分是我想通过使用列表理解来做到这一点......如果x = 3,那么可能的结果是:
[1 2 3]
[2 4 5]
[3 1 4]
[4 5 1]
Run Code Online (Sandbox Code Playgroud)
等等...
谢谢!
我应该指定我不能将列表转换为集合.抱歉! 我需要随机选择的数字进行加权.因此,如果1在列表中出现4次,3在列表中出现2次,那么1是被选中的两倍......
我想在两个选择之间随机选择*概率不等.
例如,当用户按下按钮时,25%的时间会发出声音A,75%的时间发出声音B.我可以手动执行简单的比例,如1:4和2:4但我遇到了麻烦比例如3:5.
考虑这个问题的一般方法是什么?
*我的意思是一个一个地看着不可预测.我注意到任何带有随机字样的问题都会得到一个Mensa的学生.
我正在寻找这种算法
(算法将从一个元素列表中随机选择,其中每个元素具有不同的被挑选概率(权重))
并且只发现python和c实现,在我做了C#之后,有点不同(但是我觉得更简单)我想我应该分享它,我也需要一个F#imlementation,如果有人可以做到它请发表答案
using System;
using System.Collections.Generic;
using System.Linq;
namespace ChuckNorris
{
class Program
{
static void Main(string[] args)
{
var oo = new Dictionary<string, int>
{
{"A",7},
{"B",1},
{"C",9},
{"D",8},
{"E",11},
};
var rnd = new Random();
var pick = rnd.Next(oo.Values.Sum());
var sum = 0;
var res = "";
foreach (var o in oo)
{
sum += o.Value;
if(sum >= pick)
{
res = o.Key;
break;
}
}
Console.WriteLine("result is "+ res);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以在F#中重拍它,请发布您的代码
我需要从数组中随机添加一些元素.我是通过随机化索引来做到这一点的$array[int(rand(100))]
.我希望更频繁地出现一些元素.我该怎么做?
我想到了在阵列中多次重复这些元素的愚蠢解决方案,但我相信你们可以做得更好.
algorithm ×6
probability ×5
random ×5
python ×4
.net ×1
arrays ×1
big-o ×1
c ×1
c# ×1
f# ×1
histogram ×1
math ×1
optimization ×1
performance ×1
perl ×1
r ×1
statistics ×1