Javascript 使用概率分布进行随机抽样的更好方法?

Javascript 使用概率分布进行随机抽样的更好方法?,javascript,arrays,random,Javascript,Arrays,Random,我想从数组中选择随机项,但有一定的概率分布。 目前我有: myarray=[5,5,5,95] 这使我有75%的机会获得5分,25%的机会获得95分 但是我有更多的数字,要写出所有这些数字需要花费太多的时间,有没有更快/更好的方法呢?你可以拥有一个包含任何值的对象的数组,以及一个作为数字的权重属性 //资料 常量样本=[ {值:5,权重:75}, {值:95,重量:25} ]; //请求方法 函数随机抽样{ //[0..1*重量之和 取样= 数学,随机* samples.reducesum,{

我想从数组中选择随机项,但有一定的概率分布。 目前我有: myarray=[5,5,5,95] 这使我有75%的机会获得5分,25%的机会获得95分


但是我有更多的数字,要写出所有这些数字需要花费太多的时间,有没有更快/更好的方法呢?

你可以拥有一个包含任何值的对象的数组,以及一个作为数字的权重属性

//资料 常量样本=[ {值:5,权重:75}, {值:95,重量:25} ]; //请求方法 函数随机抽样{ //[0..1*重量之和 取样= 数学,随机* samples.reducesum,{weight}=>sum+weight,0; //第一个样本n,其中[0..n]>样本的权重之和 const{value}=samples.find {weight}=>sample-=重量<0 ; 返回值; } //演示 常量计数={5:0,95:0}; 大堆 //随机抽取一百万个样本 .from{length:1000000},=>randomSamplesamples //计数每个样本 .forEachvalue=>{计数[值]+;};
logcounts;您可以拥有一个包含任何值的对象的数组,以及一个作为数字的权重属性

//资料 常量样本=[ {值:5,权重:75}, {值:95,重量:25} ]; //请求方法 函数随机抽样{ //[0..1*重量之和 取样= 数学,随机* samples.reducesum,{weight}=>sum+weight,0; //第一个样本n,其中[0..n]>样本的权重之和 const{value}=samples.find {weight}=>sample-=重量<0 ; 返回值; } //演示 常量计数={5:0,95:0}; 大堆 //随机抽取一百万个样本 .from{length:1000000},=>randomSamplesamples //计数每个样本 .forEachvalue=>{计数[值]+;}; 控制台。日志计数; 函数权重选择数组,权重{ 设s=weights.reducea,e=>a+e; 设r=Math.random*s; return array.finde,i=>r-=weights[i]<0; } let随机化数组= Array.applynull,Array32。 map=>weightedChoice[5,95],[75,25]; console.logJSON.stringifyrandomArray; 函数权重选择数组,权重{ 设s=weights.reducea,e=>a+e; 设r=Math.random*s; return array.finde,i=>r-=weights[i]<0; } let随机化数组= Array.applynull,Array32。 map=>weightedChoice[5,95],[75,25];
console.logJSON.stringifyrandomArray;这也很好。我想这的优点是权重的总和不必为1,缺点是在计算随机选择之前必须包含一个额外的循环来确定它们的总和。@PatrickRoberts:Haha,我刚刚写的…:d此算法类似于的JS版本顺便说一句,对于日志记录来说,只需执行Array32.fill.map…@PatrickRoberts无需担心。在您的提示下,我还添加了我的答案:d这也很好。我想这样做的优点是权重不必求和为1,缺点是在计算t之前必须包含一个额外的循环来确定它们的和他是随机选择。@PatrickRoberts:Haha,我刚刚写了…:D这个算法就像JS版本的。顺便说一句,对于日志记录来说,只做Array32.fill.map会更容易…@PatrickRoberts不用担心。在你的提示下,我也添加了我的答案:D