您好,
我使用此函数(在类中)随机化数字:
private int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
public void Init()
{
x = RandomNumber(0,500);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我稍后调用多个对象来执行此操作:
Obj[] obj = new Obj[64];
for( int i = 0 ; i < 64 ; i++ )
{
obj[i] = new Obj();
}
...
for( int i = 0 ; i < 64 ; i++ )
{
obj[i].Init();
}
Run Code Online (Sandbox Code Playgroud)
那么每个对象都有完全相同的'x'值.
这有什么不对?
Random应该只创建一次并Next调用单个实例.
这是因为默认情况Random下由当前时间播种 - 如果在紧密循环中调用(与您一样),则种子将是相同的,并且伪随机算法的结果将大致相同.
如果您将代码更改为此类代码,您将获得更好的结果:
private static Random random = new Random();
private int RandomNumber(int min, int max)
{
return random.Next(min, max);
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是线程安全的.如果您尝试在多线程应用程序中使用它,则会遇到问题.对于线程安全版本,我建议阅读并关注Jon Skeet的这篇文章.
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |