gpt4 book ai didi

.net - 选择唯一的随机数

转载 作者:行者123 更新时间:2023-12-04 22:58:14 27 4
gpt4 key购买 nike

我试图在 VB.NET 中随机化一个数字 3 次。每次我随机化一个数字时,它应该与其他两个数字不同。

例如我有 3 个整数。 Int1、Int2 和 Int3。我将在 1-10 之间随机化 Int1 ,然后我将在 1-10 之间随机化 Int2 但是该值不应等于我在 Int1 中随机化的值,对于 Int3 也是如此,它不应等于 Int1 和 Int2。

我已经想出了如何随机化一个数字,这是我正在使用的代码:

Dim RndNumber As Random
Dim num,num2 As Integer
RndNumber = New Random
num = RndNumber.Next(1, 11)
num2 = RndNumber.Next(1, 11)

现在我被困在如何让 num2 随机化一个不等于 num 的 1-10 之间的数字。

我感谢任何帮助,谢谢。

最佳答案

在所有示例中,RNG是一个从 NET 创建的随机数生成器 Random类(class):

Private RNG = New Random()

林克

如果您只需要两个或三个,您可以循环直到当前选择不在结果集中。但这使用一些扩展方法更简单:
Dim nums = Enumerable.Range(1, 10).
OrderBy(Function(r) RNG.Next).
Take(3).
ToArray()

这从 1 到 10 之间的所有数字开始,将它们按随机顺序排列,取前 3 个并将它们存储在 nums 中。大批。我使用了多行形式,在 . 之后中断s 来说明步骤。

只需更改范围、大小/计数和 Take()元素根据需要。例如,对于具有 5 个唯一数字 1-69(精简形式)的彩票之类的东西:
Dim winners = Enumerable.Range(1, 69).OrderBy(Function(r) RNG.Next()).Take(5).ToArray()
Dim powerball = Enumerable.Range(1, 26).OrderBy(Function(r) RNG.Next()).Take(1).First

由于强力球可以重复第一个数字,因此它来自自己的池。因为我们只想要一个,所以我们不需要数组,只需要 First() .

手动的

了解这些事情的逻辑很好,所以这里显示的是手动版本。这是通过选择并实际检查随机值来实现的:
' picked value storage
Dim picks As New List(Of Int32)

Dim pick As Int32 ' current candidate
Do
pick = RNG.Next(1, 11)
If picks.Contains(pick) = False Then
picks.Add(pick)
End If
Loop Until picks.Count = 3

这不是松散的变量,而是使用列表来保存选择。这样可以轻松查看当前选择是否已被选中。对于多个值,请使用 HashSet(Of Int32)而不是性能列表。

随机对

要创建一组随机的数字集,每个数字集为 2,例如对于匹配游戏,只需将基本值池加倍,然后将它们按随机顺序排列:
' create pool of 2 values each for 1-13
Dim nums = Enumerable.Range(1, 13).ToArray()
' concat the set to make 2 of each value, randomize
Dim pool = nums.Concat(nums).OrderBy(Function(r) RNG.Next).ToArray()

对于手动方法,您必须检查循环中每个值的计数。

“用完”精选

另一种变化是当您需要定期使用随机池,但您不知道提前需要多少。例如,宾果游戏的球或一副纸牌。

而不是指向最后一个使用的插槽(或下一个使用的插槽)的全局索引器,一个 Stack(Of T) (或 Queue )将“用完”您需要的值:
' create, randomize pool of 100 ints
Dim nums = Enumerable.Range(1, 100).OrderBy(Function(r) RNG.Next).ToArray
' use array to create Stack<T>
Dim shoe As New Stack(Of Int32)(nums)

' same as:
Dim shoe = New Stack(Of Int32)(Enumerable.Range(1, 100).
OrderBy(Function(r) RNG.Next).ToArray())

这与 100 个整数基本相同,随机化并存储在一个数组中,但没有 Take(n)因为我们都想要。然后将它们的值存储在堆栈集合中。使用它:
Console.WriteLine(shoe.Count)
For n As Int32 = 1 To 3
Console.WriteLine("Picked #{0}", shoe.Pop)
Next
Console.WriteLine(shoe.Count)

当您 Pop自动从集合中删除的值。如果您使用鞋子中的大量值,您将需要检查计数以确保它不是空的。

100
Picked #12
Picked #69
Picked #53
97



绘制 3 个值后,鞋子只剩下 97 个值。

随机笔记

在所有情况下,您的 Random生成器应该是您创建的表单级对象 一次 .切勿在循环中创建它们,否则您可能会一遍又一遍地获得相同的值。
OrderBy(Function(r) RNG.Next)随机化的方法对于随意使用通常已经足够好,但效率低下。如果您将随机化大集合和/或经常使用它,您应该考虑使用适当的 shuffle,例如 the Fisher-Yates shuffle shown here .

关于.net - 选择唯一的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35120454/

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