为什么我的随机数html扩展方法返回相同的值?

Kin*_*tor 1 asp.net-mvc

我们将在几天内进行演示,我必须进入并模拟我们的许多观点.这包括制作大量假数据等.我想我会放弃一个循环和一个返回随机数的扩展方法,所以我不必自己编写这个硬编码数据.

这是我的观看代码:

<% for(int i = 1; i < 7; i++) { %>
  <tr>
    <td class="auditsTableAgencyElement">Agency <%=i %></td>
    <td class="auditsTableResults"><%= Html.GetRandomNumber(0, 30) %></td>
    <td class="auditsTableResults"><%= Html.GetRandomNumber(0, 100) %>%</td>
    <td class="auditsTableResults"><%= Html.GetRandomNumber(0, 20) %></td>

    <% foreach (var record in Model.Categories) { %>
      <td class="auditsTableResults"><%= Html.GetRandomNumber(0, 30) %></td>
      <td class="auditsTableResults"><%= Html.GetRandomNumber(0, 100) %>%</td>
      <td class="auditsTableResults"><%= Html.GetRandomNumber(0, 20) %></td>
    <% } %>
  </tr>
<% } %>
Run Code Online (Sandbox Code Playgroud)

这是我的观点在执行此操作后的样子: 替代文字

相同的数字.我的随机数请求是否被缓存并返回给我?如果是这样,我该如何仅为此方法关闭此功能?

public static string GetRandomNumber(this HtmlHelper html, int low, int high)
{
  Random myRand = new Random();
  return myRand.Next(low, high).ToString();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

与此类问题一样,问题是您Random在每次迭代时都在创建一个新实例.

创建单个实例并重复使用它.您可以使用静态变量,但这不是线程安全的.在这种特殊情况下,每页创建一个新实例可能没问题.但是,如果两个人同时访问该页面,您仍将获得相同的数据.

理想情况下,您可以创建以线程安全方式使用的静态随机数,以创建Random的新实例,然后可以在不锁定单个线程的情况下使用该实例.例如:

public static class RandomFactory
{
    private static Random rng = new Random();
    private static readonly object padlock = new object();

    public static Random CreateRandom()
    {
        lock (padlock)
        {
            return new Random(rng.Next());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的页面中,您可以:

// Instance variable
protected readonly Random rng = RandomFactory.CreateRandom();
Run Code Online (Sandbox Code Playgroud)

并将您的方法更改为:

public static string GetRandomNumber(this HtmlHelper html, Random rng,
                                     int low, int high)
{
    return rng.Next(low, high).ToString();
}
Run Code Online (Sandbox Code Playgroud)

(我不太确定你为什么会HtmlHelper在那里,说实话 - 你没有使用它......)

最后你加注到这样的事情:

<%= Html.GetRandomNumber(rng, 0, 30) %>
Run Code Online (Sandbox Code Playgroud)

  • @KingNestor:如果从多个线程调用Next,则可能会破坏RNG的内部状态.不要这样做:) (2认同)