gpt4 book ai didi

c# - 如何从多个可能的范围中获取单个随机数?

转载 作者:太空狗 更新时间:2023-10-29 20:01:17 28 4
gpt4 key购买 nike

我希望能够从 n 个可能范围生成一个(伪)随机数,其中范围是 x, yx < y .例如,执行这段代码:

for(int i = 0; i < 10; i++)
{
Console.Write(Random.NextRanges(new Range(1, 6), new Range(10, 16), new Range(20, 31)) + " ");
}

会产生类似的东西:

3 12 5 22 1 27 29 5 10 24

方法的签名NextRanges是:

public static int NextRanges(params Range[] ranges)

Range定义为:

public struct Range
{
public int X;
public int Y;

public Range(int x, int y)
{
if (x >= y) throw new ArgumentException("x must be less than y.");
X = x;
Y = y;
}
}

我唯一不确定的是如何实现 NextRanges ,最有效的方法或最随机的方法是什么(我知道随机有时会很棘手)。你会选择随机 Range然后使用 Random.Next()在那?或者你会一直选择随机数,直到你得到一个在每个范围内的随机数吗?

是否也可以对范围进行加权,例如,使 0-100 的范围比 100-102 的范围具有更大的权重?

最佳答案

Would you choose a random Range and then use Random.Next() on that?

不,因为这会给更短范围内的数字更大的权重。例如,如果一个范围包含单个数字 42,而另一个范围包含 10,000 个数字,则生成 42 的概率大约为 50%。

Or would you keep choosing random numbers until you got one that was within each of the ranges?

不,因为那不会太有效。例如,如果第一个范围是 [1..3],第二个范围是 [200,000..200,001],则获取其中一个范围内的数字需要一会儿。

我会在范围内实现一个 Size 属性,计算总大小,在 index = [0..TotalSize-1 范围内生成一个 int ],然后选择索引处的项目,就好像您范围内的所有数字都按顺序编号一样。

例如,在您的范围内,TotalSize 将为 6+7+12=25。首先,我会在 [0..24] 范围内生成一个随机数,比如 15。然后我会看到 15 落在第三个范围内,所以我将返回 21

这会给每个范围一个与其大小成比例的权重。如果您想为您的范围分配特定的权重,则算法会有所不同:您将通过将实际大小乘以范围的权重,然后对产品求和来计算 TotalRange 的等价物。然后,您将在该加权和的范围内生成一个数字,通过从该随机数向后计算来选择范围,然后除以特定范围的权重以获得该范围内随机项目的位置。

关于c# - 如何从多个可能的范围中获取单个随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20790729/

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