2011-05-27 68 views
2

我有6個問題在6 asp.net面板服務器控制, 我需要以隨機順序一個接一個地顯示它們(一個問題是可見的,每次看不到)。在asp.net中的非重複隨機數C#

我不知道如何排除再次產生的數字。 我寫這樣的:

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 
+0

我想要的只是展示每個問題一次,我需要以隨機的方式一一展示。 – Mostafa 2011-05-27 17:34:30

回答

7

您可以將數字放入列表中,並根據您的實際數字生成您的隨機數字,但會根據列表中的其餘項目生成您的隨機數字。

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對象,或任何你需要的東西;你會得到的是隨機順序的項目。

0

你可以在「標誌」面板,你已經表現爲看到的,如果選擇的隨機數已標記進入下一個組(i ++),直到你找到一個WASN沒有標記。

+0

你有什麼建議/想法如何「標記」他們? – Mostafa 2011-05-27 17:36:34

+0

這是最簡單的解決方案,但會扭曲隨機性,例如如果第一個面板是第三個面板,那麼您現在有可能將面板4看作其他面板的兩倍。 – fearofawhackplanet 2011-05-27 17:38:04

+0

在你的會話中保存一個數組--bool [] panelsShown = new bool [6];當生成一個隨機數時,檢查單元格是否已經被標記爲true,如果是,則將其標記爲true並顯示它,否則直接找到未標記的標記,然後選擇並標記它。如果所有面板已經標記,確保你的循環不會無限。 – Maxim 2011-05-27 17:42:12

3

您需要一個面板/索引列表,然後用例如Fisher-Yates對它們進行整理。

1

開始與所有面板號列表:

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,所有的數字重新inistialise它。

-1

創建類似實例Random類這樣的:Random random = new Random(0); 定義種子隨機類

+0

此答案不正確;它不會阻止再次選擇先前選擇的面板,此外,因爲它使用恆定種子,所以每次都會導致序列相同。 – 2011-10-24 09:51:09

0

寫以下類在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);