您好
这是我如何使用随机但它总是给indexOfAChosenListCell提供“1”索引
当我调试它时会显示不同的值,但是在常规运行中我每次都会得到相同的动作。
Random有什么问题,它是静态的而不是随机的......:)
internal Square getAutomaticMove()
{
List<Square> LegalMovesArray = GetLegalSquares();
Random randomListCell = new Random();
int indexOfAChosenListCell = 0;
if (CheckForLegalSquares())
{
indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1);
}
答案 0 :(得分:21)
使randomListCell
成为实例变量并仅将其初始化一次 - 否则您将再次获得相同的数字。
来自MSDN:
默认情况下,无参数 Random类的构造函数使用 系统时钟生成其种子 值,而参数化 构造函数可以采用Int32值 根据蜱的数量 当前时间。 但是,因为时钟具有有限的分辨率,所以使用无参数构造函数来创建 紧密连续的不同随机对象会创建随机数 生成相同的生成器 随机数序列。
答案 1 :(得分:5)
答案 2 :(得分:4)
将Random声明为私有成员变量,然后将其实例化为构造函数,并仅在方法中调用Random.Next。
答案 3 :(得分:4)
我建议播种随机数字发生器。据我所知,每次运行应用程序时,最终都会得到相同的伪随机数序列。我可能弄错了。
int Seed = (int)DateTime.Now.Ticks;
Random randomListCell = new Random(Seed);
答案 4 :(得分:3)
你的随机应该在函数之外创建
Random randomListCell = new Random();
internal Square getAutomaticMove()
{
List<Square> LegalMovesArray = GetLegalSquares();
int indexOfAChosenListCell = 0;
if (CheckForLegalSquares())
{
indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1);
}
答案 5 :(得分:3)
每次需要新号码时都不要创建新的随机数;如果你想要一系列不同的随机数,你想保留一个随机对象并反复询问它们。
答案 6 :(得分:2)
我会说明差异:
var random = new Random();
var color = Color.FromArgb(200, random.Next(255), // 222
random.Next(255), // 33
random.Next(255)); // 147
结果:#DE2193
var color = Color.FromArgb(200, new Random().Next(255), // 153
new Random().Next(255), // 153
new Random().Next(255)); // 153
结果:#999999
答案 7 :(得分:0)
声明函数外部的Random对象,以便它使用相同的对象生成新的数字。您每次使用相同的种子创建新对象并为您提供大多数相同的数字...
static Random randomListCell = new Random();
internal Square getAutomaticMove()
{
List<Square> LegalMovesArray = GetLegalSquares();
int indexOfAChosenListCell = 0;
if (CheckForLegalSquares())
{
indexOfAChosenListCell = randomListCell.Next(LegalMovesArray.Count-1);
}
}