我需要以随机顺序从一个范围(例如从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
.我正在寻找不需要内存分配的东西.
谢谢.
我知道几个例程如下:
X n + 1 =例程(X n,max)
例如,类似于LCG发生器:
X n + 1 =(a*X n + c)mod m
此生成器中没有足够的参数化来生成每个序列.
梦想功能:
X n + 1 =例程(X n,max,置换数)
该例程通过索引到所有排列集合中进行参数化,将返回序列中的下一个数字.序列可以是任意大的(因此存储阵列并使用事实数字是不切实际的.
如果失败了,是否有人指向类似的函数,这些函数要么是无状态的,要么具有任意"max"的恒定状态,这样它们就会迭代一个混洗列表.
我正在寻找可以将有序整数索引值更改为随机哈希索引的恒定时间算法。如果是可逆的就好了。我需要每个索引的哈希键都是唯一的。我知道这可以通过在大文件中查找表来完成。IE 创建一个所有整数的有序集合,然后将它们随机打乱并以随机顺序写入文件。然后,您可以在需要时将它们读回。但这需要查找一个大文件。我想知道是否有一种简单的方法可以使用伪随机生成器来根据需要创建序列?
生成使用PRNG,而不是洗牌洗牌范围的答案被 erikkallen线性反馈移位寄存器貌似正确类的事情。我刚刚尝试过,但它会产生重复和漏洞。
问候大卫·艾伦·芬奇
我有一个包含10,000个条目的字符串列表.我有一个shuffle例程,但访问任何项目需要花费很多时间.浏览所有10k项目需要花费大量时间.
我想保存它做磁盘然后使用另一种方法对文件进行洗牌.
有什么建议?
algorithm ×3
c# ×1
c++ ×1
delphi ×1
hash ×1
math ×1
performance ×1
playlist ×1
random ×1
text-files ×1
tstringlist ×1