Случайное фоновое изображение на DIV - PullRequest
0 голосов
/ 13 октября 2009

Я пытаюсь получить случайно выбранное фоновое изображение (из набора из 4 изображений), которое будет отображаться в качестве фонового изображения для панели asp.net.

У меня проблема в том, что код работает при пошаговом выполнении кода в режиме отладки. После запуска кода на сайте без отладки все изображения одинаковы. Как будто случайное число не набирается достаточно быстро.

Пользовательский контроль находится внутри списка данных.

Пользовательский контроль:

<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

    }

T * 1017

Ответы [ 3 ]

1 голос
/ 13 октября 2009

Иногда случайное не совсем случайно ...

У Джона Скита есть хорошая статья на эту тему: Почему я снова и снова получаю одни и те же числа из Random?

Процитирую прямо то, что Джон сказал мне однажды:

Генератор псевдослучайных чисел (например, System.Random) на самом деле не случайно - это всегда будет производить то же самое последовательность результатов при инициализации с теми же данными. Данные это для инициализации используется число называется семя.

Основная проблема в том, что когда вы создать новый экземпляр Random, используя конструктор без параметров (как мы делаем здесь) он использует семена, взятые из "текущего времени". компьютерная идея "текущего времени" может меняться только один раз каждые 15 мс (что это вечность в вычислительной технике) - так что если вы создаете несколько новых экземпляров Случайно в быстрой последовательности, они будут все имеют одно и то же семя.

То, что вы обычно хотите (при условии, что вы не волнует возможность воспроизводить точные результаты, а вы нет нужен криптографически безопасный случайный генератор чисел) должен иметь один Случайное использование всей вашей программы, инициализируется при первом использовании. Похоже, вы могли бы просто использовать статическое поле где-то (выставлено как собственность) - в основном синглтон. К сожалению, System.Random не потокобезопасный - если вы называете это из двух разные темы, вы могли бы получить проблемы (включая получение того же последовательность чисел в обеих темах).

Вот почему я создал StaticRandom в мой маленький набор утилит - это в основном потокобезопасный способ получения случайные числа, используя один экземпляр Random и блокировка. Увидеть http://www.yoda.arachsys.com/csharp/miscutil/usage/staticrandom.html для быстрого примера, и http://pobox.com/~skeet/csharp/miscutil для самой библиотеки.

Генератор случайных чисел Джона Скита

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);
            }
        }
    }
}
0 голосов
/ 13 октября 2009

Интересно, есть ли у вас какой-то уровень кэширования, работающий на панели, из-за которого она не проходит через обработку на стороне сервера в рабочем режиме.

0 голосов
/ 13 октября 2009

Вы уверены, что ваша страница не кэшируется? Сделайте просмотр источника на странице.

Да, и должна быть какая-то функция, например, urand или srand, чтобы сделать случайность более случайной.

...