C# 如何使此代码在不重复数字的情况下工作?

C# 如何使此代码在不重复数字的情况下工作?,c#,random,arraylist,C#,Random,Arraylist,我需要以随机顺序打印从1到50的数字,而不需要重复 它 static void Main(字符串[]args) { ArrayList r=新的ArrayList(); Random ran=新的Random(); 对于(int i=0;i

我需要以随机顺序打印从1到50的数字,而不需要重复 它

static void Main(字符串[]args)
{
ArrayList r=新的ArrayList();
Random ran=新的Random();
对于(int i=0;i<50;i++)
{
r、 加上(run.Next(1,51));;
}
对于(int i=0;i<50;i++)
控制台写入线(r[i]);
Console.ReadKey();
}

如果不想重复1到50之间的数字,最好的办法是用数字1到50填充一个列表,然后洗牌内容。这里有一个关于洗牌的好帖子:

如果不想重复1到50之间的数字,最好的办法是用数字1到50填充一个列表,然后洗牌内容。这里有一个关于洗牌的好帖子:

您需要做的就是检查列表中是否已存在该号码,如果已存在,则获取另一个号码:

static void Main(string[] args)
{
    ArrayList r = new ArrayList();

    Random ran = new Random();      
    int num = 0;

    for (int i = 0; i < 50; i++)
    {
        do { num = ran.Next(1, 51); } while (r.Contains(num));
        r.Add(num);
    }

    for (int i = 0; i < 50; i++)
       Console.WriteLine(r[i]);

    Console.ReadKey();
}
static void Main(字符串[]args)
{
ArrayList r=新的ArrayList();
Random ran=新的Random();
int num=0;
对于(int i=0;i<50;i++)
{
do{num=ran.Next(1,51);}while(r.Contains(num));
r、 添加(num);
}
对于(int i=0;i<50;i++)
控制台写入线(r[i]);
Console.ReadKey();
}
编辑:这将大大提高效率,防止长时间暂停等待非冲突号码:

    static void Main(string[] args)
    {
        List<int> numbers = new List<int>();

        Random ran = new Random();
        int number = 0;
        int min = 1;
        int max = 51;

        for (int i = 0; i < 50; i++)
        {
            do
            {
                number = ran.Next(min, max);
            }
            while (numbers.Contains(number));

            numbers.Add(number);

            if (number == min) min++;
            if (number == max - 1) max--;
        }

        for (int i = 0; i < 50; i++)
            Console.WriteLine(numbers[i]);

        Console.ReadKey();
    }
static void Main(字符串[]args)
{
列表编号=新列表();
Random ran=新的Random();
整数=0;
int min=1;
int max=51;
对于(int i=0;i<50;i++)
{
做
{
编号=运行。下一个(最小值、最大值);
}
while(number.Contains(number));
数字。添加(数字);
if(number==min)min++;
如果(数字==max-1)max--;
}
对于(int i=0;i<50;i++)
控制台写入线(编号[i]);
Console.ReadKey();
}

您需要做的就是检查列表中是否已存在该号码,如果已存在,则获取另一个号码:

static void Main(string[] args)
{
    ArrayList r = new ArrayList();

    Random ran = new Random();      
    int num = 0;

    for (int i = 0; i < 50; i++)
    {
        do { num = ran.Next(1, 51); } while (r.Contains(num));
        r.Add(num);
    }

    for (int i = 0; i < 50; i++)
       Console.WriteLine(r[i]);

    Console.ReadKey();
}
static void Main(字符串[]args)
{
ArrayList r=新的ArrayList();
Random ran=新的Random();
int num=0;
对于(int i=0;i<50;i++)
{
do{num=ran.Next(1,51);}while(r.Contains(num));
r、 添加(num);
}
对于(int i=0;i<50;i++)
控制台写入线(r[i]);
Console.ReadKey();
}
编辑:这将大大提高效率,防止长时间暂停等待非冲突号码:

    static void Main(string[] args)
    {
        List<int> numbers = new List<int>();

        Random ran = new Random();
        int number = 0;
        int min = 1;
        int max = 51;

        for (int i = 0; i < 50; i++)
        {
            do
            {
                number = ran.Next(min, max);
            }
            while (numbers.Contains(number));

            numbers.Add(number);

            if (number == min) min++;
            if (number == max - 1) max--;
        }

        for (int i = 0; i < 50; i++)
            Console.WriteLine(numbers[i]);

        Console.ReadKey();
    }
static void Main(字符串[]args)
{
列表编号=新列表();
Random ran=新的Random();
整数=0;
int min=1;
int max=51;
对于(int i=0;i<50;i++)
{
做
{
编号=运行。下一个(最小值、最大值);
}
while(number.Contains(number));
数字。添加(数字);
if(number==min)min++;
如果(数字==max-1)max--;
}
对于(int i=0;i<50;i++)
控制台写入线(编号[i]);
Console.ReadKey();
}

您想要的是

下面是由实现的算法


你想要的是

下面是由实现的算法


看看这个:不要再使用
ArrayList
。它属于C#没有泛型的旧时代。改为使用
List
。看看这个:不要再使用
ArrayList
。它属于C#没有泛型的旧时代。使用
列表