我有一个List<Fruit>,
public class Fruit
{
public string Name { get; set; }
public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并且上面的列表包含两种类型的30个Fruit对象:Apple和Orange.20个苹果和10个橙子.
List<Fruit> fruits = new List<Fruit>();
fruits.Add(new Fruit(){ Name = "Red Delicious", Type = "Apple" });
fruits.Add(new Fruit(){ Name = "Granny Smith", Type = "Apple" });
fruits.Add(new Fruit(){ Name = "Sour Granny", Type = "Orange" });
fruits.Add(new Fruit(){ Name = "Delicious Yummy", Type = "Orange" });
.....
Run Code Online (Sandbox Code Playgroud)
我如何获得10个随机水果的清单(来自30个水果的篮子),但应该有3个橙子和7个苹果?
经典的Fisher Yates看起来像这样:
void shuffle1(std::vector<int>& vec)
{
int n = vec.size();
for (int i = n - 1; i > 0; --i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Run Code Online (Sandbox Code Playgroud)
昨天,我错误地"向后"实现了迭代:
void shuffle2(std::vector<int>& vec)
{
int n = vec.size();
for (int i = 1; i < n; ++i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Run Code Online (Sandbox Code Playgroud)
这个版本是否比第一个版本更糟(或更好)?它是否会扭曲由此产生的概率?
我找到了一种在互联网上洗牌的方法.
Random rand = new Random();
shuffledArray = myArray.OrderBy(x => rand.Next()).ToArray();
Run Code Online (Sandbox Code Playgroud)
但是,我有点担心这种方法的正确性.如果OrderBy x => rand.Next()对同一个项执行多次,结果可能会发生冲突并导致奇怪的事情(可能是异常).
我尝试过,一切都很好,但我仍然想知道这是否绝对安全,并且始终按预期工作,我无法通过Google找到答案.
谁能给我一些解释?
提前致谢.
假设我有一个大约50行的DataTable(SharePoint中的列表上的GetDataTable()).我想保留10个随机行,忘记其余的行.我怎样才能做到这一点?
提前致谢.
希望改变四个变量(试图改变它们在多选列表中出现的顺序).
我一直在探索一段时间,但我不能完全了解逻辑,在过去的问题中查找随机随机播放提供了超出我新手技能的超详细算法(以及此程序的需求我'我试着写,我只想制作一个多选图像选择器.
理想情况下,我喜欢这个伪代码之后的东西:
// int Answer1 = Random(min1 max4)
// int Answer2 = Random(min1 max4)
// int Answer3 = Random(min1 max4)
// int Answer4 = Random(min1 max4)
// If Answer 1 equals ANY of the other three, re-randomize Answer1 and loop.
// Loop through this cycle for all answers.
Run Code Online (Sandbox Code Playgroud)
我发布了我当前的常规代码,但坦率地说,这是垃圾.:(这似乎是一个简单的问题,但我只是不能正确.
提前致谢!
我想创建一个扩展方法,该方法应该对集合中的项进行随机播放.
我能改进以下内容吗?
public static IList<T> RandomList<T>(this IList<T> source)
{
if (source.Count <= 0) throw new ArgumentException("No Item to Randomize");
for (int i =source.Count-1 ; i>0; i--)
{
int RandomIndex = Rnd.Next(i + 1);
T temp = source[i];
source[i] = source[RandomIndex];
source[RandomIndex] = temp;
}
return source;
}
Run Code Online (Sandbox Code Playgroud) 这两个问题为洗刷IEnumerable提供了类似的算法:
以下是两种方法并排:
public static IEnumerable<T> Shuffle1<T> (this IEnumerable<T> source)
{
Random random = new Random ();
T [] copy = source.ToArray ();
for (int i = copy.Length - 1; i >= 0; i--) {
int index = random.Next (i + 1);
yield return copy [index];
copy [index] = copy [i];
}
}
public static IEnumerable<T> Shuffle2<T> (this IEnumerable<T> source)
{
Random random = new Random ();
List<T> copy = source.ToList ();
while (copy.Count > 0) {
int index …Run Code Online (Sandbox Code Playgroud) 我想随机取50个数字,这样就不能用随机方法重复它们.
以下是我目前的代码:
private void settext()
{
int i;
Queue <int> qe= new Queue<int>(50);
Random rm= new Random();
for (int g = 0; g < 50; g++)
{
i = rm.Next(1, 50);
if (!qe.Contains(i))
{
qe.Enqueue(i);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我记得看到一个方法似乎是排序,在哪里可以解开项目.
例如,我试图使用Random类显示从0到10的随机化项目.但我猜这不是最好的选择.
所以,我想为IEnumberable,List或数组创建扩展,无论什么都是最好的方法.
我有一个IEnumerable集合如下
var result1 = GetResult1() // Returns 2,4,5,6
Run Code Online (Sandbox Code Playgroud)
我必须以随机方式处理元素并创建另一个集合,结果如下:
var result2 = GetResult2(result1) // Returns 2,4,5,6 in a random order.
// An example output would be 4,6,2,5 in the resultant collection.
Run Code Online (Sandbox Code Playgroud)
我通过以下方式完成此操作:
var result1 = GetResult1();
var random = new Random();
var result2 = result1.OrderBy(order=>random.Next());
Run Code Online (Sandbox Code Playgroud)
然而,这个问题是如果我访问result2,result2中的元素会再次被洗牌,即如果我将result2的结果输出到控制台两次,则元素会再次变为juggled.
能告诉你如何保持这种制服.也就是说,一旦我处理了这个集合,它应该保持相同的方式.我必须使用懒惰的评估,因为结果非常大.
c# ×9
linq ×3
algorithm ×2
ienumerable ×2
random ×2
shuffle ×2
.net ×1
c#-4.0 ×1
c++ ×1
performance ×1
permutation ×1
probability ×1
sorting ×1