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

时间:2009-07-08 07:06:22

标签: 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>
<% } %>

以下是执行此操作后我的视图: alt text

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

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

2 个答案:

答案 0 :(得分: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());
        }
    }
}

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

// Instance variable
protected readonly Random rng = RandomFactory.CreateRandom();

并将您的方法更改为:

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

(我不太清楚为什么你在那里得到HtmlHelper,说实话 - 你没有使用它......)

最后你加入了这样的事情:

<%= Html.GetRandomNumber(rng, 0, 30) %>

答案 1 :(得分:1)

我推荐你here

getRandomNumber

: - P

&LT; /讽刺&GT;