2012-04-02 19 views
0
public class ExpAdapter : BaseExpandableListAdapter 
{ 
    private int seed = 1000; 

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService); 
      convertView = inflater.Inflate(Resource.Layout.inspection_row_2, null); 
     } 

     int currentID; 
     Random randomizer = new Random(seed); 

     TextView question = (TextView) convertView.FindViewById(Resource.Id.questionText); 
     RadioGroup radio = (RadioGroup) convertView.FindViewWithTag("actionGroup"); 
     currentID = randomizer.Next(1,101); 
     radio.Id = currentID; 
     RadioButton pass = (RadioButton) convertView.FindViewWithTag("passed"); 
     currentID = randomizer.Next(1,101); 
     pass.Id = currentID; 
     RadioButton fail = (RadioButton) convertView.FindViewWithTag("failed"); 
     currentID = randomizer.Next(1,101); 
     fail.Id = currentID; 
     RadioButton correct = (RadioButton)convertView.FindViewWithTag("corrected"); 
     currentID = randomizer.Next(1,101); 
     correct.Id = currentID; 
     RadioButton na = (RadioButton)convertView.FindViewWithTag("na"); 
     currentID = randomizer.Next(1,101); 
     na.Id = currentID; 

     string[][] items = questions.childItems(); 
     question.Text = items[groupPosition][childPosition]; 

     seed++; 

     return convertView; 
    } 
} 

ブレークポイントを使用して上記を実行するには、実行中にcurrentID = 1を使用します。上記のメソッドは、MonoDroidが親グループの下に子グループのコントロールを作成し、currentIDがALWAYS = 1であるため、繰り返し呼び出されます。クラス全体でprivate static変数としてcurrentIDとrandomizerを作成しようとしました。同じ結果。C#常に常に同じ番号

EDIT:GetChildViewへの呼び出しごとに異なるシード値を持つ新しいRandomインスタンスを作成しようとしました。上記のコードは、私がどのようにそれを行ったかを示すために編集されています。それでもcurrentIDの値は常に= 1です。以下は、Localsのランダマイザの情報のスクリーンショットです。この情報は、シード番号が何であるかにかかわらず同じように見えます。 ???

enter image description here

+1

ランダム化装置に種子を供給しようとしましたか? –

+0

はい。同じ結果。また、私の例でシードを使用すると、各繰り返しで同じ数値が生成されることは私の理解です。この番号はオブジェクトのIDに使用されており、一意である必要があります。 – jmease

+0

私はあなたに何を聞いているのか分かりません。 DateTimeを使用して新しいRandomオブジェクトを作成し、次に現在のDateTimeに基づいて新しいRandomオブジェクトを作成するGetChildViewの次の反復の前に次の乱数を5回取得します。 – jmease

答えて

0

ランダマイザは、ミリ秒単位のシステム時間で計算されます。つまり、同じミリ秒で急速に呼び出すと、同じ数でシードされ、同じ乱数が得られます。

+0

はい、私は1つだけのランダムオブジェクトを作成していて、新しいオブジェクトを作成する前に5回Nextメソッドを呼び出しています。次の新しいRandomオブジェクトが同じミリ秒で作成されたとしても、少なくとも1つのオブジェクトの値は、次の呼び出しごとに変化しませんか? – jmease

+0

@jmeaseコードは、.NET 4.0では正常に動作し、デフォルトの時間ベースのシードなどでシードされます。プラットフォーム固有の問題のようです。 –

+0

@リチャードヘイン、私はあなたが正しいかもしれないことを恐れる。 MonoDroidはこれまでのところバグが少しありました。私は、Randomクラスを使用する代わりに、インクリメントされたシード変数を使用して一意のIDを割り当てることに決めました。目的に役立つと思われる。 – jmease

関連する問題