2015-08-16 39 views
1

我有以下一段代码:列表<T>获得随机元素不起作用

private Random r = new Random(); 

    private List<T> RandomElement<T>(IQueryable<T> list, Expression<Func<T, bool>> e, int items = 3) 
    { 
     list = list.Where(e); 
     return list.Skip(r.Next(list.Count())).Take(items).ToList(); 
    }  

问题是,当我把它,并希望例如从列表中返回3级随机的物品,有时会返回3有时2,有时1?

我想随时得到3.

我在做什么错了?

+0

,顾名思义,*跳过*跳过n个元素,这意味着它可以跳过在列表​​中你看了关于'渔民耶茨shuffle' :)所有元素?如果不是,Google会阅读第一个结果。 – Eser

+0

感谢您的信息。其实从来没有听说过它,但我会给它一个阅读。 – user2818430

回答

0

如果您的列表中有10个元素,并且您要求3个“随机”项目,则在您的解决方案中,如果随机数生成器返回8,则跳过前8个元素,并且它只有2个项目可供返回项目9和10)。这就是它发生的原因。

如果你想要随机项目,而不是随机洗牌列表,不要跳过任何,只需要你想要的数字。

Randomize a List<T>

+1

'如果你想要随机项目,而不是洗牌列表',那么接受的答案就会在你的链接中使用* fisher yates shuffle * – Eser