写入文件随机数c#

时间:2012-01-27 22:05:38

标签: c# random

  

可能重复:
  Random number generator not working the way I had planned (C#)

我在c#中有这个代码,但我得到一个相同数字的结果,这有什么不对?

像p21,a21,a21 ......

        String c = "";
        int randomNumber = 0;
        for (int i = 0; i < 20; i++)
        {
            randomNumber = RandomNumber(0, 617);
            c += "a " + randomNumber + ", ";                    
        }
        file.WriteLine(c);



I am using this function

public static int RandomNumber(int min, int max)
    {
        Random random = new Random();
        return random.Next(min, max);
    }

3 个答案:

答案 0 :(得分:7)

您应该将Random作为参数传递给您的函数。虽然你的功能再没有附加价值了。

var rnd = new Random();
for (int i = 0; i < 20; i++)
{
    randomNumber = RandomNumber(rnd ,0, 617);
    c += "a " + randomNumber + ", ";                    
}

public static int RandomNumber(Random rnd, int min, int max)
{
    return rnd.Next(min, max);
}

每次执行new Random()时,都会使用时钟进行初始化。这意味着在紧密循环中,您可以多次获得相同的值。您应该保留单个 Random实例并继续在同一个实例上使用Next。

https://stackoverflow.com/a/768001/284240

修改:我在评论中读到您要在给定范围内创建20个唯一数字,这是使用HashSet<int>的一种方式:

HashSet<int> uniqueNumber = new HashSet<int>();
var rnd = new Random();
while(uniqueNumber.Count<20){
    var nextNum = rnd.Next(0, 617);
    uniqueNumber.Add(nextNum);
}

答案 1 :(得分:3)

Random的实例需要实例化一次。

static Random random = new Random();
public static int RandomNumber(int min, int max)
{        
    return random.Next(min, max);
}

在您的实现中,random在一个单位时间内使用系统时钟进行了几次实例化,因此您在极少数迭代中使用完全相同的种子值,这对于单个调用意味着您将始终从Next获得相同的值。

答案 2 :(得分:0)

将Random放在RandomNumber之外,即

static Random random = new Random();
public static int RandomNumber(int min, int max)
{
    return random.Next(min,max);
}