2017-12-18 17 views
-1

私はこの新しい数値を生成する方法を持っていますが、機能を完了するのに時間がかかります。 速いapprochで乱数を生成するには?与えられた数値配列に存在しない数値を生成する方法は?

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文の*と*の両方の部分で 'j 'をインクリメントするのですか?このアプローチにはどんな利点がありますか? –

+0

ご迷惑をおかけして申し訳ありません... –

+0

for loopなぜですか?それは再帰的に行われます。説明できますか。 – Anil

関連する問題