2009-10-12 175 views
0

我想從隨機選取的背景圖像(從4個圖像中選擇)出現爲asp.net面板的背景圖像。DIV上的隨機背景圖像

我遇到的問題是,在調試模式下單步執行代碼時,代碼的工作原理爲。一旦您在網站上運行代碼而不進行調試,所有圖像都是相同的。它幾乎就像隨機數沒有得到足夠快的拾取。

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 

    } 

牛逼

回答

1

有時候,隨機是不是真的隨機...

喬恩斯基特對話題的好文章:Why am I getting the same numbers out of Random time and time again?

要直接引述喬恩曾告訴我一個時間:

僞隨機數發生器(如 System.Random)實際上並不是隨機的 - 它始終會產生相同的 結果序列當初始化 與相同的dat一個。用於初始化的數據是 是一個號碼 ,稱爲種子。

最根本的問題是,當你 創建使用 參數構造函數隨機的一個新實例(如 我們在這裏所做的),它使用從「當前時間」採取 的種子。因此,如果 你連續快速地創建 隨機的幾個新的情況下,他們將 都具有相同的種子 - 的「當前時間」 只能更改一次爲15ms(這 是計算一個永恆)的 計算機的想法。

通常要什麼(假設你 不關心能夠 重現精確的結果,你不 需要加密的安全隨機 數發生器)就是在整個使用單一 隨機的程序, 第一次使用它被初始化。 這聽起來像你可以在某處使用一個 靜態字段(作爲 屬性公開) - 基本上是一個單身。 不幸的是System.Random不是 線程安全 - 如果你從兩個不同的線程調用它,你可能會得到 的問題(包括在兩個線程中獲得相同的 數字序列)。

這就是爲什麼我在 創建StaticRandom我的小事業工具箱 - 這是 基本上得到 隨機數,使用隨機和鎖單 實例的線程安全的方式。請參閱 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

我認爲你的東西!頁面引號「如果你使用相同的種子值兩次,你會得到相同的隨機數序列,隨機使用當前時間作爲種子。上面的代碼創建了幾個非常快速的連續實例,」當前時間「往往具有至少10ms的粒度,因此許多實例將共享相同的種子,從而創建相同的數字序列。「 我相信代碼正在執行,快速獲得與其他面板相同的時間碼「種子」,因此相同的圖像。我需要一個更強大的隨機方法。 – 2009-10-12 20:54:11

+0

@Ian - 看看Jon的MiscUtility類有一個「Robust」隨機生成器。 (鏈接在帖子中)。我也編輯過這個帖子來包含他的代碼。 – 2009-10-12 21:28:42

+0

@metro smurf,使用錯誤代碼解決了問題。感謝大家的幫助。 – 2009-10-12 21:47:38

0

你確定你的頁面不被緩存?在頁面上查看源代碼。

哦,應該有一些像urand或srand這樣的函數來使隨機更隨機。

+0

視圖源顯示了4個面板具有相同和backgroundImage網址。刷新頁面有時會用另一組4個圖像替換所有4個圖像,或者有時保持不變。 – 2009-10-12 20:48:45

0

我想知道是否在面板上有一定程度的緩存操作,導致它無法在生產模式下通過服務器端處理。

+0

服務器端代碼必須在圖像確實發生變化時工作,但在生產站點上,它會更改所有4個面板圖像。在調試模式下運行可確保每個面板都有自己的隨機圖像...... – 2009-10-12 20:50:14

+0

確切地說 - 它幾乎聽起來像面板在第一個實例上運行了服務器端處理,然後使用控制的緩存版本進行迭代2 - 4.我想知道這是否是由於一些生產模式優化。 Metro Smurf對隨機生成有一個很好的問題 - 你是否能夠消除這個問題?如果是這樣,我會進一步研究任何.net緩存,可能會在頁面或應用程序級別 – 2009-10-12 20:56:57

+0

仍在調查隨機數字代碼 – 2009-10-12 21:06:09