【问题标题】:Each object have the same array [duplicate]每个对象都有相同的数组[重复]
【发布时间】:2019-06-04 19:47:04
【问题描述】:

我在同一类的多个对象中洗牌时遇到问题。
我在构造函数调用中使用函数void shuffle()
打印我的 dataCharset 数组后,结果发现每个对象都有相同的洗牌数组。

我在控制台应用程序中使用 .net framework 4.8。
我尝试使用一个临时数组,然后将其复制到 dataCharset 数组中(这是我需要随机播放的目标数组)。

char[] dataCharset =
{
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
    '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
    '!', '$', '#', '@', '-'
};

void shuffle()
{
    Random random = new Random();

    for (int i = 0; i < dataLength; i++)
    {
        int index = random.Next(0, dataLength);
        char temp = dataCharset[index];
        dataCharset[index] = dataCharset[i];
        dataCharset[i] = temp;
    }
}

构造函数看起来像:

public Guesser()
{
    dataLength = dataCharset.Length;
    shuffle();
    Console.WriteLine(dataCharset);
}

还有我创建对象的主文件
Guesser 是我的班级

Guesser guesser1 = new Guesser();
Guesser guesser2 = new Guesser();
Guesser guesser3 = new Guesser();
Guesser guesser4 = new Guesser();

如果我使用“new”关键字创建每个对象,为什么每个对象都有相同的数组? 我希望每个对象都有自己的洗牌数组。

【问题讨论】:

  • 请提供完整的编译代码示例。展示整个课程,并展示您使用 new 运算符创建多个实例的位置,以及您正在使用它们做什么。样本应该是最少的,不多也不少于证明问题所需要的;它应该证明问题
  • 请用代码示例而不是 cmets 更新 问题
  • 请在您的问题中添加一个完整的、可编译的代码示例。请编辑您的问题并将代码添加到您的问题中。该示例应该演示该问题,并且应该可以编译。它应该包括你正在创建的类的全部、完整、完整而不是部分的定义,它应该显示你是如何创建它的以及你正在用它做什么。它应该编译。不是粘贴箱。请将代码添加到您的问题中。
  • 仅供参考,您的“char”数组中填充了整数
  • 1.您应该实施 Fisher-Yates 洗牌,而您目前没有。 2.您对new Random() 的调用不在for 循环中,所以我认为前面的答案不适用。 3.(基本上)你上面的代码确实会导致显示不同的列表,所以我怀疑你的代码中有一些东西你上面遗漏了。

标签: c# arrays .net shuffle


【解决方案1】:

有可能(虽然不像我通常看到的那么明显)您的代码足够快,以至于您对 Random 对象使用相同的种子。尝试使其成为类的静态属性:

static Random random = new Random();

void shuffle()
{
    for (int i = 0; i < dataLength; i++)
    {
        int index = random.Next(0, dataLength);
        char temp = dataCharset[index];
        dataCharset[index] = dataCharset[i];
        dataCharset[i] = temp;
    }
}

【讨论】:

  • 我更新了我的完整数组。我输入了 1,2,3,4,5,6 来简化它。所以还是不正确?
  • 我在构造函数之间使用和不使用 Thread.Sleep() 测试了 OP 的代码。这个答案是正确的。
  • @Kulkejszyn 好吧,char 只是一个字节,所以它会编译,但它们不是可打印字符。我假设您有某种方式可以看到“洗牌”数组总是相同的,而实际值是不相关的。
  • @DStanley 除非对每个 int 进行显式强制转换,否则它不会编译。在 C# 中,char 声称不仅仅是一个字节。实际上是两个字节。
  • @EdPlunkett 好点。无论如何,我已经从答案中删除了该部分,因为它与问题正交。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多