[英]Picking Random Numbers in c#
大家好,我在選擇隨機數碼來解決一副牌時遇到了問題。 為了隨機洗牌我們試圖在每個循環中選擇一張隨機卡,但似乎如果我們用完了一種,我們就不能隨機選擇其他類型。 它進入無限循環。 有什么建議?
(翻譯:Maca = spade,sinek = club,kupa = heart,karo = diamond,vale = jack,kiz = queen,papaz = king)
public class KartKarma : MonoBehaviour {
public GameObject[] Deste;
public static GameObject KupaAs, Kupa2, Kupa3, Kupa4, Kupa5, Kupa6, Kupa7, Kupa8, Kupa9, Kupa10, KupaVale, KupaKiz, KupaPapaz;
public static GameObject KaroAs, Karo2, Karo3, Karo4, Karo5, Karo6, Karo7, Karo8, Karo9, Karo10, Karo11, Karo12, Karo13;
public static GameObject SinekAs, Sinek2, Sinek3, Sinek4, Sinek5, Sinek6, Sinek7, Sinek8, Sinek9, Sinek10, Sinek11, Sinek12, Sinek13;
public static GameObject MacaAs, Maca2, Maca3, Maca4, Maca5, Maca6, Maca7, Maca8, Maca9, Maca10, Maca11, Maca12, Maca13;
public GameObject[] Kupa = {KupaAs, Kupa2, Kupa3, Kupa4, Kupa5, Kupa6, Kupa7, Kupa8, Kupa9, Kupa10, KupaVale, KupaKiz, KupaPapaz};
public GameObject[] Karo = {KaroAs, Karo2, Karo3, Karo4, Karo5, Karo6, Karo7, Karo8, Karo9, Karo10, Karo11, Karo12, Karo13};
public GameObject[] Sinek = {SinekAs, Sinek2, Sinek3, Sinek4, Sinek5, Sinek6, Sinek7, Sinek8, Sinek9, Sinek10, Sinek11, Sinek12, Sinek13};
public GameObject[] Maca = {MacaAs, Maca2, Maca3, Maca4, Maca5, Maca6, Maca7, Maca8, Maca9, Maca10, Maca11, Maca12, Maca13};
List<GameObject> deste = new List<GameObject>();
// Use this for initialization
void Start () {
int i = 0;
while(i < 26){
int a = Random.Range(1,5);
if (a == 1) {
int b = Random.Range(0,13);
if(Maca != null){
while(Maca[b] == null){
b = Random.Range(0,13);
}
deste.Add(Maca[b]);
Maca[b] = null;
}
else {
while(a == 1)
a = Random.Range(2,5);
}
}
if (a == 2) {
int b = Random.Range(0,13);
if(Sinek != null){
while(Sinek[b] == null)
b = Random.Range(0,13);
deste.Add (Sinek[b]);
Sinek[b] = null;
}
else {
while(a == 2)
a = Random.Range(1,5);
}
}
if (a == 3) {
int b = Random.Range(0,13);
if(Karo != null){
while(Karo[b] == null)
b = Random.Range(0,13);
deste.Add (Karo[b]);
Karo[b] = null;
}
else {
while(a == 3)
a = Random.Range(1,5);
}
}
if (a == 4) {
int b = Random.Range(0,13);
if(Kupa != null){
while(Kupa[b] == null){
b = Random.Range(0,13);
}
deste.Add(Kupa[b]);
Kupa[b] = null;
}
else {
while(a == 4)
a = Random.Range(1,5);
}
}
i++;
}
}
void Update () {
}
}
使用適當的shuffle算法,例如Knuth(又名Fisher-Yates) :
/// <summary>Used to shuffle collections.</summary>
public class Shuffler
{
/// <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 readonly Random _rng = new Random();
}
然后:
var shuffler = new Shuffler();
...
shuffler.Shuffle(deste);
由@Paul發布的鏈接確實表明 - 請注意Random
不是一個特別好的隨機數生成器。 如果需要,您可以替換更好的一個,但底層的混洗算法保持不變。
while(a == 1)
a = Random.Range(2,5);
這是你無限循環的原因。 另外,那部分:
while(Sinek[b] == null)
b = Random.Range(0,13);
也是令人討厭的,因為它不能保證條件永遠滿足。
我覺得行有
while(a == 1)
while(a == 2)
while(a == 3)
while(a == 4)
造成這個問題。 請重新檢查你的邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.