は、以下のクラスは、ブローカーを表して考えてみましょう:ランダム加重選択
public class Broker
{
public string Name = string.Empty;
public int Weight = 0;
public Broker(string n, int w)
{
this.Name = n;
this.Weight = w;
}
}
私は、アカウントにその重みを取って、ランダムに配列からブローカーを選択したいと思います。
あなたは以下のコードについてどう思いますか?
class Program
{
private static Random _rnd = new Random();
public static Broker GetBroker(List<Broker> brokers, int totalWeight)
{
// totalWeight is the sum of all brokers' weight
int randomNumber = _rnd.Next(0, totalWeight);
Broker selectedBroker = null;
foreach (Broker broker in brokers)
{
if (randomNumber <= broker.Weight)
{
selectedBroker = broker;
break;
}
randomNumber = randomNumber - broker.Weight;
}
return selectedBroker;
}
static void Main(string[] args)
{
List<Broker> brokers = new List<Broker>();
brokers.Add(new Broker("A", 10));
brokers.Add(new Broker("B", 20));
brokers.Add(new Broker("C", 20));
brokers.Add(new Broker("D", 10));
// total the weigth
int totalWeight = 0;
foreach (Broker broker in brokers)
{
totalWeight += broker.Weight;
}
while (true)
{
Dictionary<string, int> result = new Dictionary<string, int>();
Broker selectedBroker = null;
for (int i = 0; i < 1000; i++)
{
selectedBroker = GetBroker(brokers, totalWeight);
if (selectedBroker != null)
{
if (result.ContainsKey(selectedBroker.Name))
{
result[selectedBroker.Name] = result[selectedBroker.Name] + 1;
}
else
{
result.Add(selectedBroker.Name, 1);
}
}
}
Console.WriteLine("A\t\t" + result["A"]);
Console.WriteLine("B\t\t" + result["B"]);
Console.WriteLine("C\t\t" + result["C"]);
Console.WriteLine("D\t\t" + result["D"]);
result.Clear();
Console.WriteLine();
Console.ReadLine();
}
}
}
私はそれほど自信がありません。私がこれを実行すると、ブローカーAはブローカーDよりも多くのヒットを得て、同じ重量を持っています。
もっと正確なアルゴリズムはありますか?
ありがとうございます!
こんにちは先生、私はあなたの質問を見て、あなたのアルゴリズムを使用してJavaで私自身のadrotatorクラスを作成するためにインスピレーションを得ました。データベース上のブローカー数が100万人の場合は、データベースからブローカーを選択する方法を説明してください。最初のnを選択し、アルゴリズムを適用してランダムなブローカーを選択し、次のリクエストでn + 1から始まる次のn個のブローカーを選択しますか? – qualebs
私は非常に似たような行に沿ってライブラリを書いています...それはいくつかの追加機能があり、大きなデータセット用に最適化されています:https://github.com/kinetiq/Ether.WeightedSelector –