DIV上的随机背景图像

时间:2009-10-12 20:27:30

标签: c# asp.net random panel datalist

我正在尝试将随机选择的背景图像(来自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

    }

Ť

3 个答案:

答案 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)

我想知道你是否在面板上运行了某种程度的缓存,导致它无法在生产模式下运行服务器端处理。