Givenは、辞書内のN個のアイテムのセットとそれに関連するオカレンスです。 今度は、アイテムごとに1つのスロット以上の、全体的な確率に基づいて、各アイテムに正確にXスロットを割り当てる必要があります。 double
からint
への変換は、いくつかの点で確率を切り捨てとしてアサートは、トリガーしかしN個のアイテムを少なくとも1回セットに配付
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
public static class Program
{
public static void Main(string[] args)
{
var dict = new Dictionary<char,int>();
dict.Add('a' , 10); dict.Add('b' , 0);
dict.Add('c' , 4); dict.Add('d' , 1);
dict.Add('e' , 9); dict.Add('f' , 0);
var distributionMap = Distribute(dict , 40);
}
public static Dictionary<T,int> Distribute<T>(Dictionary<T,int> occurMap , int slots)
{
var freeSlots = slots - occurMap.Count;
var total = occurMap.Sum(x => x.Value);
var distMap = new Dictionary<T,int>();
foreach(var pair in occurMap)
{
var probability = (double)pair.Value/total;
var assignedSlots = probability * freeSlots;
distMap[ pair.Key ] = (int)(1 + assignedSlots);
}
Debug.Assert(distMap.Select(x => x.Value).Sum() == slots);
return distMap;
}
}
:ここ
は、私が作ってみたものです。
は、どのように私は彼らの数に基づいてアイテムに少なくとも一度はすべてのスロットをマッピングしていますか?
確率は分数なので、百分率を得るには分数または100を掛ける必要があります。合計が整数の場合、c#はpair.value/totalを整数に変換するため、合計をdoubleにキャストする必要があります。あなたは本当にpair.value/totalを非整数にします。 – jdweng
Math.Ceiling()かもしれませんか? – Master117
@jdwengなぜパーセンテージが必要ですか?また、確率は、私が二重に1つのオペラントを投げたように、すでに倍である。 – nonsensation