我正在尝试访问列表中随机元素的值。目前,我的代码似乎正在返回元素而不是值。
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的长度和存储在其中的值随着程序的每次运行而改变,但它们总是整数。
答案 0 :(得分: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)];
}
}
在您的场景中使用它的一种方法:
// make this a field or something global
public IEnumerbale<int> randomiser = Randomise(_randList);
// then later
return randomiser.First();
答案 1 :(得分:2)
首先你应该初始化一次Random。把它变成一个字段:
private Random _rand = new Random();
然后从适当的范围获得一个随机数。 if(x!= 0)无效 - Next()返回numbersform&lt; 0,n)range
return _randMoveDecider[_rand.Next(_randMoveDecider.Count)];
答案 2 :(得分: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();
编辑:这是一个测试程序,演示了如何使用该方法。请注意,由于不正确使用Random,它会产生非常不平衡的结果,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类创建Random静态实例,或在程序中更广泛地共享。这在FAQ for Random中进行了讨论。
public static class Extensions
{
static Random rand = new Random();
public static int randomOne(this List<int> theList)
{
return theList[rand.Next(0, theList.Count)];
}
}
答案 3 :(得分:0)
var random = new Random();
var item = list.ElementAt(random.Next(list.Count()));