C# 不要让随机数显示两次
我试图将随机数保存在一个列表中,同一个数字不能出现两次。 这是一个宾果游戏,使用这种方法显示exb12,然后用户点击enter,就会显示一个新的数字。这将一直持续到用户写入q 这是可行的,但数字可以显示两次C# 不要让随机数显示两次,c#,shuffle,C#,Shuffle,我试图将随机数保存在一个列表中,同一个数字不能出现两次。 这是一个宾果游戏,使用这种方法显示exb12,然后用户点击enter,就会显示一个新的数字。这将一直持续到用户写入q 这是可行的,但数字可以显示两次 static void bingo() { Random rnd =new Random(); List<int> check = new List<int>(); string choice = ""; while (choice
static void bingo()
{
Random rnd =new Random();
List<int> check = new List<int>();
string choice = "";
while (choice != "Q")
{
int number = rnd.Next(1, 76);
while (!check.Contains(number))
{
kontroll.Add(number);
}
if (number <=15)
{
choice = Interaction.InputBox("B" + number);
choice = choice.ToUpper();
}
else if(number <= 30)
etc.
static void bingo()
{
随机rnd=新随机();
列表检查=新列表();
字符串选择=”;
while(选项!=“Q”)
{
整数=rnd.Next(1,76);
而(!check.Contains(number))
{
添加(编号);
}
如果(数字这样的东西应该行得通(如果我没看错你的问题)
Enumerable.Range(1,76).OrderBy(n=>rnd.NextDouble())有几种方法可以做到这一点:
跟踪“呼叫”的号码-如果列表中有号码,请选择其他号码
从原始列表中删除已调用的号码,然后每次随机选择一个新号码
按随机数对可能值的列表进行排序,只需遍历列表即可
实现这一点的最简单方法是使用HashSet
var usedNumbers = new HashSet<int>();
...
int number;
do {
number = rnd.Next(1, 76);
} while (usedNumbers.Contains(number));
usedNumbers.Add(number);
var usedNumbers=new HashSet();
...
整数;
做{
编号=rnd.Next(1,76);
}while(usedNumbers.Contains(number));
使用编号。添加(编号);
因此,首先生成一个包含所有可能字母/数字的列表,然后将该列表洗牌,然后在列表中迭代。只要你继续“前进”,就永远不会有重复在列表中。这个答案的可能重复提示了一个非常好的解决方案,但您还没有完全遵循它。-1:这是最糟糕的洗牌实现之一,因为选择最后一个数字将花费比永远少一点的时间(将选择70多个项目,随机数将必须命中剩余5个插槽中的一个)。这取决于你将选择多少个数字。如果你从76个数字中选择10个,这将不会有问题。(让用户选择集合中的所有数字将让他一直获胜。)根据问题“这是一个宾果游戏”,因此很有可能需要选择所有数字(或至少是重要部分)@AlexeiLevenkov它仍然只是O(72^2),几乎任何计算机都能做到handle@OlivierJacot-Descombes你有没有玩过宾果游戏,有人叫过一个号码,但你的号码表上没有?