c# - .NET Core 与 .NET Framework / C# 控制台应用程序 - 方法不起作用
问题描述
所以我犯了一个错误,我没有将项目创建为 C# 控制台应用程序,而是创建了 .NET Core 一个。这是一个简单的游戏(康威的生命游戏),其中实现的一件事是创建一个随机板(2D 阵列),对其进行转换,然后将其打印到控制台。
随机板生成在 .NET Core 中运行良好,但是如果我尝试将我的 cs 文件(包括 Program.cs)粘贴到 .NET Framework 或 C# 应用程序中,除了所说的随机生成之外,一切似乎都在工作。当我调试时,它似乎也工作正常,但在从 BoardGenerator.cs 中的 GenerateRandom 返回随机生成的板时,它返回一个包含所有真值或所有假值的数组。
我没有更改任何代码,我试图删除所有构建文件并重新构建,没有任何效果,这让我发疯。
程序.cs
class Program
{
static void Main()
{
var game = new Game();
Console.WriteLine("CONWAY'S GAME OF LIFE");
Console.WriteLine();
var folder = @"D:\_programming projects\game-of-life\GameOfLife\patterns\";
var files = Directory.GetFiles(folder, "*.txt");
for (var i = 0; i < files.Length; i++)
{
Console.WriteLine(i + 1 + ": " + Path.GetFileNameWithoutExtension(files[i]));
}
Console.WriteLine(files.Length + 1 + ": Random");
Console.Write("Enter number to load board: ");
var input = Console.ReadLine();
int.TryParse(input, out var option);
option--;
try
{
if (option == files.Length)
game.SetBoard(new BoardGenerator().GenerateRandom(Constants.BoardRows, Constants.BoardColumns));
else
game.SetBoard(new BoardGenerator().GenerateFromFile(
files[option],
Constants.BoardRows,
Constants.BoardColumns));
}
catch (Exception)
{
Console.WriteLine("Error");
}
game.PrintBoard();
while (true)
{
Thread.Sleep(200);
Console.Clear();
game.MutateBoard();
game.PrintBoard();
}
}
}
BoardGenerator.cs
public class BoardGenerator
{
private readonly bool[] _values = { true, false };
private bool[,] _board;
public bool[,] GenerateRandom(int noRows, int noColumns)
{
_board = new bool[noRows, noColumns];
BoardProcessor.ProcessValue(_board, tile => _values[new Random().Next(0, _values.Length)]);
return _board;
}
[...]
}
BoardProcessor.cs
public static class BoardProcessor
{
public static void ProcessValue(bool[,] board, Func<bool, bool> func)
{
for (var i = 0; i < board.GetLength(0); i++)
for (var j = 0; j < board.GetLength(1); j++)
board[i, j] = func(board[i, j]);
}
}
同样,此代码适用于 .NET Core。有什么问题?
解决方案
.NET Framework 和 .NET Core 具有不同的Random
默认构造函数实现。两者都尝试生成一些默认种子来启动伪随机序列,但它们生成种子的方式不同。特别是 .NET Core 实现使用内部全局随机对象来生成随机种子,从而保证所有顺序调用的new Random()
. 然而,框架实现将Environment.TickCount
其用作种子,这会带来风险,即调用new Random()
足够快的顺序调用将获得相同的种子(因为在实例初始化期间不更新滴答计数),这意味着相同的伪随机所有实例的序列Random
在那个时期用默认构造函数初始化。这就是您的情况最有可能发生的情况。修复很简单 - 正如建议的那样,在调用 Random
之前使用初始化的单个实例。BoardProcessor.ProcessValue
推荐阅读
- docker - InfluxDB docker 容器磁盘使用情况
- c - STM32F207 Nucleo144板,写入永久内存
- ios - PresentationButton 没有触发两次动作
- python - 让我的 python 脚本工作并调用我的变量的问题
- angular - Executionfailed':app:mergeDebugResources'.java.util.concurrent:com.android.builder.internal.aapt.v2.Aapt2InternalException:AAPT2 aapt2-3.3.0-5013011
- php - 如何在 PHP 中将所有数组元素移动到全局范围?
- javascript - 选择时如何从 datalist->option 元素中获取“rel”值?
- angular - 集成 polyfill 以使 Angular 与 Internet Explorer 兼容的正确方法是什么?
- pandas - 如何在pandas中获得v每列的百分比分布?
- eclipse - 自 Windows 10 更新 1809 和 gc.print() / gc.copyArea(