gpt4 book ai didi

c# - 分配不同结果的最佳方式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:56 25 4
gpt4 key购买 nike

我有一个名为“GetValue()”的方法,它应该在每次方法调用时返回值“A”、“B”、“C”或“D”。

我希望此方法在 30% 的方法调用中返回值“A”,在 14% 的方法调用中返回值“B”,在 31% 的方法调用中返回值“C”,等等...

这是顺利分配这些值的最佳方式,我不希望该方法连续返回值“A” xxx 次,因为值“A”离它请求的结果百分比最远。

谢谢所有的回答。

最佳答案

您可以使用 Random class实现这一目标:

private static Random Generator = new Random();

public string GetValue()
{
var next = Generator.Next(100);
if (next < 30) return "A";
if (next < 44) return "B";
if (next < 75) return "C";
return "D";
}

更新

对于更通用的随机加权值存储,以下可能是一个很好的起点:

public class WeightedValueStore<T> : IDisposable
{
private static readonly Random Generator = new Random();

private readonly List<Tuple<int, T>> _values = new List<Tuple<int, T>>();
private readonly ReaderWriterLockSlim _valueLock = new ReaderWriterLockSlim();

public void AddValue(int weight, T value)
{
_valueLock.EnterWriteLock();
try
{
_values.Add(Tuple.Create(weight, value));
}
finally
{
_valueLock.ExitWriteLock();
}
}

public T GetValue()
{
_valueLock.EnterReadLock();
try
{
var totalWeight = _values.Sum(t => t.Item1);
var next = Random.Next(totalWeight);
foreach (var tuple in _values)
{
next -= tuple.Item1;
if (next < 0) return tuple.Item2;
}
return default(T); // Or throw exception here - only reachable if _values has no elements.
}
finally
{
_valueLock.ExitReadLock();
}
}

public void Dispose()
{
_valueLock.Dispose();
}
}

这样就可以使用了:

public string GetValue() 
{
using (var valueStore = new WeightedValueStore<string>())
{
valueStore.AddValue(30, "A");
valueStore.AddValue(14, "B");
valueStore.AddValue(31, "C");
valueStore.AddValue(25, "D");
return valueStore.GetValue();
}
}

关于c# - 分配不同结果的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8712897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com