我正在尝试将随机选择的背景图像(来自4个图像的选择)显示为asp.net面板的背景图像。
我遇到的问题是,在调试模式下单步执行代码时代码正常工作。一旦在网站上运行代码而没有调试,所有图像都是相同的。它几乎就好像随机数字没有得到足够快的速度。
usercontrol在datalist中。
usercontrol是这样的:
<asp:Panel ID="productPanel" CssClass="ProductItem" runat="server">
<div class="title" visible="false">
<asp:HyperLink ID="hlProduct" runat="server" />
</div>
<div class="picture">
<asp:HyperLink ID="hlImageLink" runat="server" />
</div>
<div class="description" visible="false">
<asp:Literal runat="server" ID="lShortDescription"></asp:Literal>
</div>
<div class="addInfo" visible="false">
<div class="prices">
<asp:Label ID="lblOldPrice" runat="server" CssClass="oldproductPrice" />
<br />
<asp:Label ID="lblPrice" runat="server" CssClass="productPrice" /></div>
<div class="buttons">
<asp:Button runat="server" ID="btnProductDetails" OnCommand="btnProductDetails_Click"
Text="Details" ValidationGroup="ProductDetails" CommandArgument='<%# Eval("ProductID") %>'
SkinID="ProductGridProductDetailButton" /><br />
<asp:Button runat="server" ID="btnAddToCart" OnCommand="btnAddToCart_Click" Text="Add to cart"
ValidationGroup="ProductDetails" CommandArgument='<%# Eval("ProductID") %>' SkinID="ProductGridAddToCartButton" />
</div>
</div>
背后的代码是:
protected void Page_Load(object sender, EventArgs e)
{
// Some code here to generate a random number between 0 & 3
System.Random RandNum = new System.Random();
int myInt = RandNum.Next(4);
if (productPanel.BackImageUrl != null)
{
switch (myInt)
{
case 0:
productPanel.BackImageUrl = "../App_Themes/emmaharris/images/frame1.gif";
break;
case 1:
productPanel.BackImageUrl = "../App_Themes/emmaharris/images/frame2.gif";
break;
case 2:
productPanel.BackImageUrl = "../App_Themes/emmaharris/images/frame3.gif";
break;
case 3:
productPanel.BackImageUrl = "../App_Themes/emmaharris/images/frame4.gif";
break;
}
}
// End of new code to switch background images
}
Ť
答案 0 :(得分:1)
有时,Random并不是随机的......
Jon Skeet有一篇关于这个主题的好文章:Why am I getting the same numbers out of Random time and time again?
直接引用Jon曾告诉我的一次:
伪随机数发生器(如 System.Random)实际上并不是随机的 - 它总会产生相同的效果 初始化时的结果序列 用相同的数据。这些数据 用于初始化的是一个数字 叫种子。
基本问题是当你 创建一个新的Random使用实例 无参数构造函数(as 我们在这里做的)它使用种子 从“当前时间”。该 计算机对“当前时间”的看法 可能每15ms只更换一次(其中 在计算中是永恒的 - 所以如果 你创建了几个新的实例 随机快速连续,他们会 都有相同的种子。
你通常想要什么(假设你 不关心能够 重现确切的结果,而你没有 需要加密安全随机 数字生成器)是一个单一的 在整个程序中随机使用, 在第一次使用时初始化。 这听起来像你可以使用一个 静态字段在某处(暴露为 财产) - 基本上是一个单身人士。 不幸的是System.Random不是 线程安全 - 如果你从两个调用它 不同的线程,你可以得到 问题(包括得到同样的问题) 两个线程中的数字序列。)
这就是我创建StaticRandom的原因 我的小工具箱 - 它是 基本上是一种线程安全的获取方式 随机数,使用单个 随机和锁的实例。看到 http://www.yoda.arachsys.com/csharp/miscutil/usage/staticrandom.html 一个简单的例子,和 http://pobox.com/~skeet/csharp/miscutil 对于图书馆本身。
Jon Skeet的杂项实用随机生成器
using System;
namespace MiscUtil
{
/// <summary>
/// Thread-safe equivalent of System.Random, using just static methods.
/// If all you want is a source of random numbers, this is an easy class to
/// use. If you need to specify your own seeds (eg for reproducible sequences
/// of numbers), use System.Random.
/// </summary>
public static class StaticRandom
{
static Random random = new Random();
static object myLock = new object();
/// <summary>
/// Returns a nonnegative random number.
/// </summary>
/// <returns>A 32-bit signed integer greater than or equal to zero and less than Int32.MaxValue.</returns>
public static int Next()
{
lock (myLock)
{
return random.Next();
}
}
/// <summary>
/// Returns a nonnegative random number less than the specified maximum.
/// </summary>
/// <returns>
/// A 32-bit signed integer greater than or equal to zero, and less than maxValue;
/// that is, the range of return values includes zero but not maxValue.
/// </returns>
/// <exception cref="ArgumentOutOfRangeException">maxValue is less than zero.</exception>
public static int Next(int max)
{
lock (myLock)
{
return random.Next(max);
}
}
/// <summary>
/// Returns a random number within a specified range.
/// </summary>
/// <param name="min">The inclusive lower bound of the random number returned. </param>
/// <param name="max">
/// The exclusive upper bound of the random number returned.
/// maxValue must be greater than or equal to minValue.
/// </param>
/// <returns>
/// A 32-bit signed integer greater than or equal to minValue and less than maxValue;
/// that is, the range of return values includes minValue but not maxValue.
/// If minValue equals maxValue, minValue is returned.
/// </returns>
/// <exception cref="ArgumentOutOfRangeException">minValue is greater than maxValue.</exception>
public static int Next(int min, int max)
{
lock (myLock)
{
return random.Next(min, max);
}
}
/// <summary>
/// Returns a random number between 0.0 and 1.0.
/// </summary>
/// <returns>A double-precision floating point number greater than or equal to 0.0, and less than 1.0.</returns>
public static double NextDouble()
{
lock (myLock)
{
return random.NextDouble();
}
}
/// <summary>
/// Fills the elements of a specified array of bytes with random numbers.
/// </summary>
/// <param name="buffer">An array of bytes to contain random numbers.</param>
/// <exception cref="ArgumentNullException">buffer is a null reference (Nothing in Visual Basic).</exception>
public static void NextBytes(byte[] buffer)
{
lock (myLock)
{
random.NextBytes(buffer);
}
}
}
}
答案 1 :(得分:0)
您确定您的网页未缓存吗?在页面上做一个视图源。
哦,应该有一些像urand或srand这样的函数来使随机更随机。
答案 2 :(得分:0)
我想知道你是否在面板上运行了某种程度的缓存,导致它无法在生产模式下运行服务器端处理。