如何更改以下代码,每次从数据库中获取50个不同的随机数据?
return (from examQ in idb.Exam_Question_Int_Tbl
where examQ.Exam_Tbl_ID==exam_id
select examQ).OrderBy(x=>x.Exam_Tbl_ID).Take(50);
Run Code Online (Sandbox Code Playgroud) 我有一个从数据库中获得的食谱列表,如下所示:
List<RecipeNode> _recipeList;
Run Code Online (Sandbox Code Playgroud)
RecipeNode除其他外,有一个属性引用一个或多个标签(如晚餐,早餐,边,素食,假日,和其他约60个).
public sealed class RecipeNode
{
public Guid RecipeId;
public Byte[] Tags; //Tags such as 1, 5, 6, 8, 43
//... More stuff
}
Run Code Online (Sandbox Code Playgroud)
从_recipeListO(1)中查找随机配方当然很容易,但我需要做的是找到一个随机配方,例如Tags在O(1)中有5个.
现在,我唯一的想法是制作一个List<RecipeNodes>由标签键入的数组.例如:
List<RecipeNode>[] _recipeListByTag;
Run Code Online (Sandbox Code Playgroud)
然后,_recipeListByTag[5]将包含Tags数组中具有5的所有配方的列表.然后,我可以在O(1)中的该标签内选择随机允许的标签和随机配方.
这种方法的缺点是这个多维数组的大小Recipes * Tags(例如,所有配方中的Tags.length的总和),由于我在这里存储了大量的食谱,因此开始占用大量的内存.阵列.当然,既然RecipeNode是一个引用类型,我只重复4byte指向配方的指针,所以这仍然是最好的方法.
是否有更高效的数据结构或算法可以让我找到包含某个允许标签的随机配方?谢谢!
我正试图从一张小桌子中随机抽取10%的样本.我以为我只是使用RAND()函数并选择随机数小于0.10的那些行:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND() < 0.10
Run Code Online (Sandbox Code Playgroud)
但我很快发现RAND()总是返回相同的数字!让我想起这个xkcd卡通片.

没问题,RAND函数采用种子值.我将定期运行此查询,如果我在不同的日子运行它,我希望它给出不同的结果,所以我使用日期和唯一行ID的组合来播种它:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND(CAST(GETDATE) AS INTEGER) + RowID) < 0.10
Run Code Online (Sandbox Code Playgroud)
我还是没有得到任何结果!当我显示RAND返回的随机数时,我发现它们都在一个狭窄的范围内.从RAND获取随机数似乎需要您使用随机种子.如果我首先有一个随机种子,我就不需要随机数!
我已经看到之前有关此问题的讨论:
他们没帮我.TABLESAMPLE在页面级别工作,这适用于大表,但不适用于小表,并且看起来它适用于WHERE子句之前.TOP with NEWID不起作用,因为我不知道我想要多少行.
任何人都有解决方案,或者至少有一个提示?
编辑:感谢AlexCuse提供适用于我的特定案例的解决方案.现在更大的问题,如何使兰德表现?