我張貼正確執行洗牌的算法,因爲另一張貼在這裏不生產一個統一的洗牌。
正如其他答案所述,對於少量要隨機化的值,您可以簡單地使用這些值填充數組,然後使用數組,然後使用所需的許多值。
以下是Fisher-Yates Shuffle(又名Knuth Shuffle)的實現。 (閱讀該鏈接的「實現錯誤」部分(搜索「總是從每次迭代中的整個有效數組索引中選擇j」),以查看關於此處發佈的其他實現的錯誤的一些討論。)
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
static class Program
{
static void Main(string[] args)
{
Shuffler shuffler = new Shuffler();
List<int> list = new List<int>{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
shuffler.Shuffle(list);
foreach (int value in list)
{
Console.WriteLine(value);
}
}
}
/// <summary>Used to shuffle collections.</summary>
public class Shuffler
{
/// <summary>Creates the shuffler with a <see cref="MersenneTwister"/> as the random number generator.</summary>
public Shuffler()
{
_rng = new Random();
}
/// <summary>Shuffles the specified array.</summary>
/// <typeparam name="T">The type of the array elements.</typeparam>
/// <param name="array">The array to shuffle.</param>
public void Shuffle<T>(IList<T> array)
{
for (int n = array.Count; n > 1;)
{
int k = _rng.Next(n);
--n;
T temp = array[n];
array[n] = array[k];
array[k] = temp;
}
}
private System.Random _rng;
}
}
http://csharpindepth.com/Articles/Chapter12/Random.aspx – Habib
只要你只是創建Random對象一次,你不應該有問題。如果你想要的數字是唯一的(還沒有這個數字),那麼你需要添加額外的,而不僅僅是使用隨機 – RoneRackal
你在尋找「數字1..10排列」而不是「隨機數在範圍1..10「? (Definiitely給你隨機序列10個唯一的數字) –