我需要以随机顺序从一个范围(例如从x到y)创建一个数字列表,这样每个订单都有相同的机会.
对于我用C#编写的音乐播放器,我需要这个,以随机顺序创建播放列表.
有任何想法吗?
谢谢.
编辑:我对更改原始列表不感兴趣,只需从随机顺序中的某个范围中获取随机索引,以便每个订单都有相同的机会.
这是我到目前为止所写的内容:
public static IEnumerable<int> RandomIndexes(int count)
{
if (count > 0)
{
int[] indexes = new int[count];
int indexesCountMinus1 = count - 1;
for (int i = 0; i < count; i++)
{
indexes[i] = i;
}
Random random = new Random();
while (indexesCountMinus1 > 0)
{
int currIndex = random.Next(0, indexesCountMinus1 + 1);
yield return indexes[currIndex];
indexes[currIndex] = indexes[indexesCountMinus1];
indexesCountMinus1--;
}
yield return indexes[0];
}
}
Run Code Online (Sandbox Code Playgroud)
它正在工作,但唯一的问题是我需要在内存中分配一个大小为的数组count.我正在寻找不需要内存分配的东西.
谢谢.
嗨,我有以下列表,我想输入model到列表,但随机进行.我看过几个例子,但它们似乎真的很混乱.我只想要一个简单的方法来做到这一点?
List<Car> garage ----randomise------> List<string> models
List<Car> garage = new List<Car>();
garage.Add(new Car("Citroen", "AX"));
garage.Add(new Car("Peugeot", "205"));
garage.Add(new Car("Volkswagen", "Golf"));
garage.Add(new Car("BMW", "320"));
garage.Add(new Car("Mercedes", "CLK"));
garage.Add(new Car("Audi", "A4"));
garage.Add(new Car("Ford", "Fiesta"));
garage.Add(new Car("Mini", "Cooper"));
Run Code Online (Sandbox Code Playgroud) 以下代码部分按我的意愿工作
for (int i = 1; i <= practicehistory.TotalNumQuestions; i++)
{
query = from a in db.Questions
where a.CategoryId == practicehistory.CategoryId
orderby a.QuestionId
select a;
randomNumber = random.Next(1, count + 1);
int qNum = query.Skip(randomNumber - 1).First().QuestionId;
asked.QuestionId = qNum;
asked.OrderAsked = i;
db.AskedHistories.Add(asked);
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
但是,我偶尔会遇到随机数与之前的for循环运行中的随机数相同的情况.我想知道是否有人有一个优雅的解决方案,我怎么能确保只生成一个比以前没有生成过的随机数?我正在考虑填充一个数组并检查它,但这似乎是多余的!