我的程序有点问题。
我在我的程序中创建了一个这样的类:
class ClassA
{
public int number = -1;
public Random rnd = new Random();
public void randomize()
{
var random = rnd;
number = rnd.next(4)+2;
}
}
我打算创建和数组,每个数组都包含一个类, 我是这样创造的。我将数组转移到一个新方法,所以我可以检查它。
public static void Main()
{
ClassA[,] arrayOfClass = new Class[6,6];
ClassA classA= new Class();
int i, j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
classA.randomize();
arrayOfClass[i, j] = classA;
}
}
CheckClassA(arrayOfClass);
}
private void CheckClassA(ClassA[,] arrayOfClass)
{
int i,j;
for(i=0;i<6;i++)
{
for (j = 0; j < 6; j++)
{
Console.Writeline("Randoming : "+arrayOfClass[i,j].number);
{
}
}
当我运行这些时,控制台只会反复生成相同的数字,但每次运行时都会有不同的情况,就像只将它随机化一次然后再从不随机化它。
我的问题是: 1.为什么我的程序只是随机化一次并在数组的所有值上返回相同的数字? 2.我的传输数组的方法有误吗?
我尝试使用下面的其他类型来检查我的随机化是否失败,但没有它没有,因为它返回了我预期的随机数。
public static void Main()
{
ClassA[,] arrayOfClass = new Class[6,6];
ClassA class= new Class();
int i, j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
class.randomize();
arrayOfClass[i, j] = class;
Console.Writeline("Randoming : " + arrayOfClass[i,j].number);
}
}
}
任何建议和帮助都是适当的。感谢
答案 0 :(得分:2)
问题是由于你实际上并没有创建新的ClassA
对象而引起的,你只是对每个数组索引使用相同的对象。您似乎也在某些地方拼错ClassA
Class
,我不确定它是如何编译的。将您的类初始化移动到您分配给arrayOfClass
的循环中。
public static void Main()
{
ClassA[,] arrayOfClass = new ClassA[6,6];
//ClassA classA= new Class();
int i, j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
classA = new ClassA();
classA.randomize();
arrayOfClass[i, j] = classA;
}
}
CheckClassA(arrayOfClass);
}
完成此操作后,您将遇到另一个问题,他们都会因为一个非常不同的原因返回相同的数字。
它生成相同的数字,因为每个ClassA都是在非常接近的时间段内创建的,而Random
是使用相同的种子初始化的。
这是来自MSDN上的Random()默认构造函数页面:
默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。使用单个Random对象生成所有随机数可以避免此问题。您还可以通过修改系统时钟返回的种子值,然后将此新种子值显式提供给Random(Int32)构造函数来解决此问题。有关更多信息,请参阅Random(Int32)构造函数。
所以基本上因为Random
是伪随机的,它是由一个基于系统时钟的数字初始化的。解决此问题的最佳方法是在Random
的所有实例之间共享相同的ClassA
对象,方法是将其设为static
或将Random
的实例传递给randomize
1}}方法。
这应解决问题(将其设为static
):
class ClassA
{
public int number = -1;
public static Random rnd = new Random();
public void randomize()
{
var random = rnd;
number = rnd.next(4)+2;
}
}
答案 1 :(得分:0)
使随机对象成为静态,因此每个类的实例都引用它。
这是因为C#使用伪随机算法,其中每个下一个值都以某种方式依赖于先前的值。
对于Random类的无参数实例化,它默认使用当前时钟值,因此您的类的每个实例都创建具有相同起始值的Random对象,并且对它们调用Next()返回相同的值,而该值用于另一个Next()和那些值也是一样的。
答案 2 :(得分:0)
您遇到的真正问题是,对于每个条目,您的数组始终设置为相同的对象。每次迭代时都需要new
一个新的ClassA,否则你只会指向最后一个.number。
当然,这是除了'每次都会使用一个新的Random()',你应该像这样做静态:
public static void Main()
{
ClassA[,] arrayOfClass = new ClassA[6,6];
ClassA classA;
int i, j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
classA = new ClassA(); // MISSING THIS LINE CAUSED ARRAY TO ONLY HAVE LAST ENTRY
classA.randomize();
arrayOfClass[i, j] = classA;
}
}
CheckClassA(arrayOfClass);
Console.ReadLine();
}
private static void CheckClassA(ClassA[,] arrayOfClass)
{
int i,j;
for(i=0;i<6;i++)
{
for (j = 0; j < 6; j++)
{
Console.WriteLine("Randoming : " + arrayOfClass[i, j].number);
}
}
}
public class ClassA
{
public int number = -1;
public static Random rnd = new Random();
public void randomize()
{
number = rnd.Next(4) + 2;
}
}
}