0

リストのランダム要素の値にアクセスしようとしています。現時点では、私のコードは値ではなく要素を返しているようです。

int x = _randMoveDecider.Count;

//makes sure x is never more than the array size
if(x != 0)
  {
    x = x - 1 ;
  }

Random _r = new Random();

_move = _r.Next(_randMoveDecider[x]);

return _randMoveDecider[_move];

現時点で _randMoveDecider が値 2、5、および 9 を保持している場合、リストの値ではなく 0、1、または 2 が返されますが、どこが間違っているのでしょうか?

[編集] _randMoveDecider の長さとそこに格納されている値は、プログラムを実行するたびに変化しますが、それらは常に整数です。

4

4 に答える 4

3

これだけでどう?

// as a field somewhere so it's initialised once only
public Random _r = new Random();

    // later in your code
var _randList = new List<int>{4,5,8,9};
var _move = _r.Next(_randList.Count);
return _randList[_move];

さらに良いことに、リストをランダム化するものがあります。

public static Random _rand = new Random();

public IEnumerable<T> Randomise<T>(IList<T> list)
{
    while(true)
    {
        // we find count every time since list can change
        // between iterations
        yield return list[_rand.Next(list.Count)];
    }
}

シナリオで使用する 1 つの方法:

// make this a field or something global
public IEnumerbale<int> randomiser = Randomise(_randList);

// then later
return randomiser.First();
于 2012-05-01T05:42:49.053 に答える
2

まず、Random を 1 回初期化する必要があります。それをフィールドにします:

private Random _rand = new Random();

次に、適切な範囲から乱数を取得します。if(x!=0) は役に立たない - Next() は <0, n) 範囲の数値を返す

return _randMoveDecider[_rand.Next(_randMoveDecider.Count)];
于 2012-05-01T05:42:33.403 に答える
1

この拡張クラスをメインクラス内に追加するだけです。

public static class Extensions
{
    public static int randomOne(this List<int> theList)
    {
        Random rand = new Random(DateTime.Now.Millisecond);
        return theList[rand.Next(0, theList.Count)];
    }
}

そしてそれを呼びます:

int value = mylist.randomOne();

編集:これは、メソッドの使用方法を示すテストプログラムです。ランダムの誤った使用により、100のうち50を超える「乱数」が同じであるという非常に不均衡な結果が生成されることに注意してください。

class Program
{
    static void Main(string[] args)
    {
        var myList = Enumerable.Range(0, 100).ToList();
        var myRandoms = myList.Select(v => new { key = v, value = 0 })
                 .ToDictionary(e => e.key, e => e.value);

        for (int i = 0; i < 100; i++)
        {
            var random = myList.RandomOne();
            myRandoms[random]++;
        }

        Console.WriteLine(myRandoms.Values.Max());
        Console.ReadLine();
    }
}

この問題を修正するには、Extensionクラスのランダム静的インスタンスを作成するか、プログラムでより広く共有します。これについては、ランダムに関するFAQで説明されています。

public static class Extensions
{
    static Random rand = new Random();
    public static int randomOne(this List<int> theList)
    {
        return theList[rand.Next(0, theList.Count)];
    }
}
于 2012-05-01T06:11:34.950 に答える
0
var random = new Random();
var item = list.ElementAt(random.Next(list.Count()));
于 2012-05-01T07:26:28.800 に答える