2017-12-18 421 views
-1

我有這種方法來生成新的數值,但它需要很長時間才能完成該功能。 如何快速生成隨機數?如何生成給定數值數組中不存在的數值?

public int GeneratenewID(int[] OptionId) 
    { 
     Random ran = new Random(); 
     int SearchId = ran.Next(1, OptionId.Length*2); 
     if (!OptionId.Contains(SearchId)) 
     { 
      return SearchId; 
     } 
     else 
     { 
      return GeneratenewID(OptionId); 
     } 
    } 
+2

這是幾乎可以肯定是一個破碎的洗牌算法。 Google「c#fisher yates shuffle」。 –

+6

退一步說明**爲什麼**你認爲你需要這個。這味道像一個XY問題 - https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem。 – mjwills

+5

將'Random ran = new Random();'從函數中取出,併爲隨機實例使用一個類字段。隨機空構造函數使用系統時間作爲種子需要很長時間,而在遞歸方法中,它會在系統時間改變之前運行幾次,所以它會一遍又一遍地產生相同的數字。 –

回答

0

這將肯定如此嘗試的工作:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int [] OptionId=new int[] 
      { 
       0, 1,4,7,3,1,37,9 
      }; 
      Program p = new Program(); 

      int a= p. GeneratenewID(OptionId); 

     } 


     public int GeneratenewID(int[] OptionId) 
     { 
      Random ran = new Random(1); 
      int number = 0; 
      for (int j = 0; j < OptionId.Length ; j++) 
      { 
       number = ran.Next(OptionId.Length); 
       if (!OptionId.Contains(number)) 
        break; 
       else 
        j--; 
      } 
      return number; 
     } 
    } 
} 
+0

爲什麼在'for'語句的兩個部分和'for'的主體內部增加'j'?這種方法有什麼好處? –

+0

對不起,輸入錯誤... –

+0

爲什麼要循環?當它通過遞歸完成時。你可以解釋嗎。 – Anil