【问题标题】:Non-repetitive random number in asp.net C#asp.net C#中的非重复随机数
【发布时间】:2011-09-03 14:04:37
【问题描述】:

我在 6 asp.net 面板服务器控制中有 6 个问题, 我需要以随机顺序一个一个地向他们展示所有面板(一个问题是可见的,另一个是不可见的)。

我不知道如何排除该号码再次生成。 我是这样写的:

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Random rnd = new Random();
                int startNumber = rnd.Next(1, 6);
                ShowNextPanel(startNumber);
            }
        }

    private void ShowNextPanel(int excludeNumber)
    {
        Random rnd = new Random();
        //I need to exclude the "excludeNumber" here but I don't know how !?
        int number = rnd.Next(1, 6);
        switch (number)
        {
            case 1:
                {
                    Panel1.Visible = true;
                    break;
                }
            case 2:
                {
                    Panel2.Visible = true;
                    break;
                }
            case 3:
                {
                    Panel3.Visible = true;
                    break;
                }
            case 4:
                {
                    Panel4.Visible = true;
                    break;
                }
            case 5:
                {
                    Panel5.Visible = true;
                    break;
                }
            case 6:
                {
                    Panel6.Visible = true;
                    break;
                }
        }

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
       // InsertToDB(1, DropDownList1.SelectedValue);
        Panel1.Visible = false;
        ShowNextPanel(1);

    }
    protected void Button2_Click(object sender, EventArgs e)
    {
       // InsertToDB(2, DropDownList2.SelectedValue);
        Panel2.Visible = false;
        ShowNextPanel(2);

    }
//and go on till button6_click

【问题讨论】:

  • 我只想将每个问题显示一次,然后我需要以随机方式一一显示。

标签: c# asp.net random numbers


【解决方案1】:

您可以将数字放在一个列表中,并根据列表中的剩余项目而不是根据您的真实数字生成随机数。

Random random = new Random();
List<int> nums = new {1, 2, 3, 4, 5, 6}; // or whatever you need to put there.
List<int> result = new List<int>(); // will hold your results in order.
while(nums.Count > 0){
    int idx = random.next(0, nums.Count);
    result.add(nums[idx]);
    nums.RemoveAt(idx);
}
return result;

您不必在nums 列表中使用int 值;它可以是你的 Question 对象,或者你需要的任何东西;你会得到随机排列的物品。

【讨论】:

    【解决方案2】:

    您需要一个面板/指数列表,然后使用例如 Fisher-Yates 将它们随机排列。

    【讨论】:

      【解决方案3】:

      从所有面板编号的列表开始:

      var panels = new List<int>() { 1, 2, 3, 4, 5, 6 }
      

      您需要“记住”您已经在回发中看到的面板,因此您可以将其存储在 ViewStateSession 中。

      每次您需要一个新号码时:

      Random random = new Random();
      var idx = random.next(0, panels.Count);
      var selectedPanel = panels[idx];
      panels.Remove(selectedPanel);
      

      panels.Count() == 0时,用所有数字重新初始化它。

      【讨论】:

        【解决方案4】:

        您可以将已显示的面板“标记”为已显示,如果选择的随机数已标记,则转到下一个面板 (i++),直到找到未标记的面板。

        【讨论】:

        • 这是最简单的解决方案,但会扭曲随机性,例如如果第一个面板是面板 3,那么您现在看到面板 4 的可能性是其他面板的两倍。
        • 在会话中保存一个数组 - bool[] panelShown = new bool[6];生成随机数时只需检查单元格是否已标记为真,如果是则将其标记为真并显示,否则执行 i++ 直到找到未标记然后选择它并标记它。如果所有面板都已标记,请确保您的循环不会是无限的。
        • 如果让它真正随机化对您很重要,那么计算剩余的未标记面板数量,并从未标记面板的计数中选择一个随机数。例如,如果您的数组是 FFTFTF,并且您选择了最多 4 的随机数。转到 i 为 FALSE。
        【解决方案5】:

        在您的 C# 页面中编写以下类,

        int RandNo = 0;
        
        private int RandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }
        

        然后在需要的地方调用以下方法,

        RandNo = RandomNumber(10000000, 99999999);
        Response.Write(RandNo);
        

        【讨论】:

          【解决方案6】:
          ----------------aspx page code------------------
          <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
          
          <!DOCTYPE html>
          
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head runat="server">
              <title></title>
          </head>
          <body>
              <form id="form1" runat="server">
                  <div>
                     <asp:Label ID="lblRandom" runat="server"></asp:Label>
                  </div>
              </form>
          </body>
          </html>
          
          
          ------------------aspx.cs page code-------------------
          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Web;
          using System.Web.UI;
          using System.Web.UI.WebControls;
          
          public partial class Test : System.Web.UI.Page
          {
              static Random random = new Random();
          
              protected void Page_Load(object sender, EventArgs e)
              {
                  randomnumber();
              }
          
              private void randomnumber()
              {
                  lblRandom.Text = Convert.ToString(random.Next(10, 300));
              }
          }
          

          【讨论】:

            【解决方案7】:

            创建类似这样的实例随机类:Random random = new Random(0); 为随机类定义种子

            【讨论】:

            • 这个答案不正确;它不会阻止之前选择的面板再次被选中,而且由于它使用一个常量种子,它会导致序列每次都相同。
            猜你喜欢
            • 2013-12-24
            • 2010-12-09
            • 1970-01-01
            • 1970-01-01
            • 2014-06-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多