c# - 多次调用时生成的随机字符串不是随机的

标签 c# asp.net

<分区>

我正在尝试创建一个随机生成的单词字符串,除非我连续多次调用它,否则它工作正常。这是一个 WebForms 页面,单词列表来自一个文件。

我怀疑在没有 C# 的情况下我无法理解某些东西,或者 ASP.NET 在这种情况下可能会起作用,有人可以解释为什么会发生这种情况以及如何进行修复吗?

这是方法

public string GeneratePhrase()
{
    // get dictionary file
    var data = File.ReadAllLines(HttpContext.Current.Server.MapPath("~/libs/words.txt"));

    Random rand = new Random();
    int r1 = rand.Next(data.Count());
    int r2 = rand.Next(data.Count());
    int r3 = rand.Next(data.Count());

    string p1 = data.ElementAt(r1).ToLower();
    string p2 = data.ElementAt(r2).ToLower();
    string p3 = data.ElementAt(r3).ToLower();

    string ret = string.Format("{0}{1}{2}", p1, p2, p3);
    return ret;
}

如果我在 PostBack 期间调用它一次,它很好并且总是创建一个随机的单词组合。但是,如果我在 PostBack 期间多次使用它,它只会重复每次调用中的相同随机字符串。

string s1 = this.GeneratePhrase();
string s2 = this.GeneratePhrase();
string s3 = this.GeneratePhrase();
Response.Write(s1);
Response.Write(s2);
Response.Write(s3);

输出

tirefriendhotdog
tirefriendhotdog
tirefriendhotdog

为什么会发生这种情况?

最佳答案

Random rand = new Random(); 使用当前时间作为种子值,因此快速连续多次调用它会得到相同的随机序列。您可以:

  • 创建一个用于所有请求的Random对象
  • 用不同的伪随机数作为种子,例如 Guid.NewGuid().GetHashCode()
  • 使用不依赖于时间的不同随机数生成器。

关于c# - 多次调用时生成的随机字符串不是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36207121/

相关文章:

c# - Web Api 2 : Custom parameter validation (typeconverter)

asp.net - Radgrid 停止同时添加新行和编辑行的功能

c# - 发送的电子邮件仍然包含 HTML 标签。

c# - Visual Studio 2008 html 项目文档

c# - 使用 C# 填充 bootstrap 下拉列表

c# - 远程服务器返回错误 : (405) Method Allowed

c# - 将 float* 编码到 C#

jquery - Bootstrap 样式不适用于打印

asp.net - 将角色分配给匿名 session

c# - 如何确定构建程序集的 MSBuild 版本?