我有一个列表
,其中包含对项目进行抽样的概率(权重)。例如,列表
包含如下所示的5个值。
我尝试了这样的方法,首先把概率列表做成累加形式。
0.1、0.5、0.7、0.8、1.0
那么我的做法如下。我生成一个随机double,并在列表上迭代以找到第一个大于随机double的项,然后返回它的索引。
Random r = new Random();
double p = r.nextDouble();
int total = list.size();
for(int i=0; i < total; i++) {
double d = list.get(i);
if(d > p) {
return i;
}
}
return total-1;
我不确定二分搜索能有什么帮助。假设我生成了p=0.01。然后,二分搜索可以使用递归,如下所示。
compare 0.01 to 0.7, repeat with L = 0.1, 0.5 compare 0.01 to 0.1, stop compare 0.01 to 0.5, stop
0.01小于0.7、0.5和0.1,但我显然只想要0.1。因此,当使用二分搜索时,停止条件对我来说仍然不清楚。
如果有一个图书馆来帮助这类事情,我也很感兴趣。
以下是如何使用二分搜索,从累积概率开始:
public static void main (String[] args) {
double[] cdf = {0.1, 0.5, 0.7, 0.8, 1.0};
double random = 0.75; // generate randomly between zero and one
int el = Arrays.binarySearch(cdf, random);
if (el < 0) {
el = -(el + 1);
}
System.out.println(el);
}
附言。当概率列表很短时,简单的线性扫描可能会证明与二分搜索一样有效。
这是我的代码: 如果我先调用readAllData(),然后再调用readData(),我会得到一个RangeError:
我有两个不同长度的向量,每个向量包含0到50之间的数字。有些数字在向量中不包含,其他数字可能出现多次。 我想画一条线,显示每个数字在每个向量中包含的频率,即数字的频率。 如果我将中断设置为每个可能的数字之间,我可以绘制显示频率的直方图: 我知道有一个经验累积分布函数(),它会形成一个S形;但我想要的是一个非累积的经验分布函数,它将导致类似阶梯形钟形曲线的结果,类似于直方图的轮廓。 我能得到的最接近
我想使用以下循环创建一个新列。表中只有“open”和“start”列。我想创建一个新列“startopen”,如果“start”等于1,那么“startopen”等于“open”。否则,“startopen”等于此新创建列上方行中的任何“startopen”。目前,我能够通过以下方式实现这一点: 这有效,但对于大型数据集来说非常慢。是否有任何内置函数可以更快地完成此操作?
我使用以下行对Sqlite查询的行进行循环。 当行数大约为15000时,需要很长时间。空的块需要大约4秒,而有一些代码的
我对cosmos DB的分区密钥感到困惑。我有一个数据库/容器,大约有4000条小记录。如果我使用分区键筛选器尝试sql语句,则RUs和持续时间会比不使用时长更大。 有人明白这一点吗? 在此示例中,容器的分区键是/partitionkey