我有一个名为 Cleint 的类,因为我有一个函数,我想用一个函数的不同结果从Cleint做一个三实例,但结果是相同的,这是我的代码:< / p>
Programm.cs:
class Program
{
static void Main(string[] args)
{
Cleint B = new Cleint();
Cleint k = new Cleint();
Cleint S = new Cleint();
Console.WriteLine(B.GenerateAddress());
Console.WriteLine(k.GenerateAddress());
Console.WriteLine(S.GenerateAddress());
Console.ReadLine();
}
}
和Cleint.cs:
class Cleint
{
public string GenerateAddress()
{
var parts = new List<string>();
Random random = new Random();
for (int i = 0; i < 4; i++)
{
int newPart = random.Next(0, 255);
parts.Add(newPart.ToString());
}
string address = string.Join(".", parts);
p;
return address;
}
}
谢谢你的帮助
答案 0 :(得分:2)
问题在于您如何使用随机数生成 - 您在每种情况下都在创建Random
的新实例。
有关详细信息,请参阅my article on random numbers,但基本上您应该为所有呼叫使用相同的Random
实例。
假设您的课程不是多线程的,您可以将其更改为 Random
中有Client
字段,或者Random
GenerateAddress
中的参数。无论哪种方式,您都可以在Main
中创建一个实例,并为所有三种情况传递对该实例的引用。
答案 1 :(得分:2)
Random
不是随机的 - 它是伪随机的,默认构造函数使用当前时间作为序列的种子。
当快速连续调用时,此时间将相同且序列相同。
如果您只有一个线程(因为Random
不是线程安全的),您可以使用静态字段来确保使用相同的Random
实例:
class Cleint
{
private static Random random = new Random();
public string GenerateAddress()
{
var parts = new List<string>();
for (int i = 0; i < 4; i++)
{
int newPart = random.Next(0, 255);
parts.Add(newPart.ToString());
}
string address = string.Join(".", parts);
return address;
}
}
答案 2 :(得分:1)
当您创建一个新的Random对象时,它会使用PC上的当前时间作为其生成器的种子。如果您快速连续创建许多Random对象,它们将生成相同的“随机”数字。
尝试创建单个Random对象并从中生成。