首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET核心与.NET框架/ C#控制台应用程序-方法不工作

.NET核心与.NET框架/ C#控制台应用程序-方法不工作
EN

Stack Overflow用户
提问于 2018-09-23 13:22:34
回答 1查看 1.1K关注 0票数 0

因此,我犯了一个错误,没有创建一个C#控制台应用程序的项目,而是创建了.NET Core。这是一个简单的游戏(康威的生命游戏),其中的一件事是创建一个随机板(2D阵列),转换它,然后打印到控制台。

随机板生成在.NET核心中运行良好,但是,如果我试图将包括Program.cs在内的cs文件粘贴到.NET框架或C#应用程序中,那么除了所谓的随机生成之外,一切似乎都能正常工作。当我调试时,它似乎也正常工作,但是在从GenerateRandom在BoardGenerator.cs中返回随机生成的板时,它返回一个包含所有真值或所有假值的数组。

我没有修改过一行代码,我试着删除所有构建文件并重新构建,没有什么工作,这让我抓狂。

Program.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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核心中工作。有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-23 18:28:21

.NET框架和.NET核心有不同的Random默认构造函数的实现。两者都试图生成一些默认的种子来启动伪随机序列,但是它们生成种子的方式是不同的。特别是,.NET核心实现使用内部全局随机对象生成随机种子,这保证了new Random()的所有顺序调用都有不同的种子。但是,框架实现使用Environment.TickCount作为种子,这就带来了这样的风险:调用足够快的new Random()的顺序调用将获得相同的种子(因为在实例初始化期间不更新滴答计数),int旋转意味着在此期间使用默认构造函数初始化的所有Random实例的伪随机序列相同。这很可能发生在你的案子里。修复很简单-正如建议的那样,使用在Random调用之前初始化的单个BoardProcessor.ProcessValue实例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52466499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档