- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个控制台程序来模拟有一副纸牌,用户应该能够;
我正在努力想办法让牌组回到起点
当我尝试再次使用初始化数组时; string[] Deck = { x,x,x } 它似乎也不喜欢那样
任何指点将不胜感激!下面的代码;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CardArranger
{
class Program
{
static void Main(string[] args)
{
string[] Deck =
{
"D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "DJ", "DQ", "DK",
"H1", "H2", "H3", "H4", "H5", "H6", "H7", "H8", "H9", "H10", "HJ", "HQ", "HK",
"C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "CJ", "CQ", "CK",
"S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10", "SJ", "SQ", "SK",
};
Random r1 = new Random();
while (true)
{
//display number of random cards
Console.WriteLine("write shuffle to shuffle or 'sort' to organise the deck again");
string Uinput = Console.ReadLine();
bool isCount = int.TryParse(Uinput, out int noCards);
if (isCount)
{
for (int i = 0; i < noCards; i++)
{
Console.WriteLine(Deck[r1.Next(0, 52)]);
}
}
else
{
if (Uinput.Equals("shuffle"))
{
Shuffle(ref Deck, r1);
Console.WriteLine("Shuffled Deck");
for (int i = 0; i < Deck.Length; i++)
{
Console.WriteLine(Deck[i] + " , ");
}
Console.WriteLine();
Console.WriteLine("---");
}
else if (Uinput.Equals("sort"))
{
//Implement your sort method here
Console.WriteLine("Sorted Deck");
for (int i = 0; i < Deck.Length; i++)
{
Console.WriteLine(Deck[i] + " , ");
}
Console.WriteLine();
Console.WriteLine("---");
}
else
{
Console.WriteLine("Unrecognised Command");
}
}
Console.WriteLine("Press Any Key to Repeat");
Console.ReadKey();
}
}
//Fisher-Yates Shuffle
static void Shuffle(ref string[] OriginalArray, Random Rnd)
{
for (int i = 0; i < OriginalArray.Length; i++)
{
string tmp = OriginalArray[i];
int r = Rnd.Next(0, OriginalArray.Length);
OriginalArray[i] = OriginalArray[r];
OriginalArray[r] = tmp;
}
}
static void Sort(ref string[] ShuffledArray)
{
// sort the deck back in order
}
}
}
最佳答案
简单地将数组分配给原始数组的副本可能是处理此问题的最简单方法。话虽如此,使用 Array.sort()
和自定义比较器函数对其进行排序是有益的,因为您可能希望在将来维护卡片状态(见下文):
static void Sort(ref string[] ShuffledArray)
{
Array.Sort(ShuffledArray, CardComparator);
}
public static int CardComparator(string a, string b)
{
Dictionary<string, int> rank = new Dictionary<string, int>()
{
{"A", 0}, {"1", 1}, {"2", 2}, {"3", 3}, {"4", 4},
{"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9},
{"10", 10}, {"J", 11}, {"Q", 12}, {"K", 13},
};
int cmp = "HCS".IndexOf(a[0]) - "HCS".IndexOf(b[0]);
if (cmp == 0)
{
return rank[a.Substring(1)] - rank[b.Substring(1)];
}
return cmp;
}
这应该说明您可能很快就会遇到的一些程序设计问题。问题是排序需要解析字符串以确定每张牌的点数和花色。这对于编写游戏逻辑会有问题;您将花费大量精力进行解析。
为了解决这个问题,我建议写一个结构体或类来封装一张卡片。成员属性可以是 Rank
和 Suit
以及相应的 getter 和 setter(如果适用)。从长远来看,这种重构将得到肯定的返回(!)。 Deck
类也是合适的,它包含一个Card
成员数组以及Sort
和Shuffle
函数。
此外,您的随机播放代码似乎有偏见;检查pseudocode on Wikipedia并尝试重新实现它,直到您可以在大型数据集上运行它的无偏排序。以下是在数据集上运行排序数十万次并记录元素结束位置的示例分布(无偏排序将提供均匀分布):
111258
104215
99394
96347
95288
95949
98992
104344
111426
关于c# - 在 C# 中反向 Fisher-Yates Shuffle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594920/
现在我正在开发一套文字游戏作为自学的一种方式(并重新创建一些我最喜欢的文字游戏!)在一位“真正”学习编程的 friend 的帮助下,我们实现了一个很好的排列方法在我的一门课上。它正在查找 3 个及以上
我是一般编码的新手,现在已经使用 javascript 有一段时间了 - 对于我在发布此问题时可能犯的任何失误,提前致歉。我研究了 2 个小时的大部分时间,无法自己得出答案,所以我在这里注册了一个帐户
我知道F-Y和reservoir sampling都可以实现shuffle array。比如我们在一个m * n的扫雷板上部署k个炸弹。 我已经完成了示例代码: public int[][] init
所以我目前正在使用 Actionscript 3.0 制作问答游戏,我想使用 Fisher-Yates 随机播放算法随机播放问题: 这是我的代码: var questions:Array = [1,2
我并行启动几个依赖于随机数的 C/C++ 程序。对这个话题还算陌生,听说过段时间应该做seed。 此外,我使用 Fisher Yates 算法获得具有唯一随机打乱值的列表。但是,并行启动程序两次会为两
我正在使用标准的 Fisher-Yates 算法随机洗牌数组中的一副牌。但是,我不确定这是否真的会产生真实世界洗牌后所有可能排列的真实分布。 V8 的 Math.random 只有 128 位的内部状
根据维基百科和Java标准库的实现,shuffling https://en.wikipedia.org/wiki/Fisher–Yates_shuffle (Fisher Yates Shuffli
意识到当某些事情看起来好得令人难以置信时,我想我会提出这个问题,希望能清除任何小 Sprite 。我回顾了我能找到的几个相关主题,但我的问题仍然存在。 我对 Haskell 比较陌生,在我的实验中,我
我将洗牌算法实现为: import random a = range(1, n+1) #a containing element from 1 to n for i in range(n):
我将洗牌算法实现为: import random a = range(1, n+1) #a containing element from 1 to n for i in range(n):
我一直在尝试直接对二维数组的前 N 个元素执行部分 fisher-yates 洗牌,但没有成功。我知道我可以将 2D 数组转换为 1D 数组,执行随机播放然后将其转回,但如果可能的话我想避免这种情
你会说现代版的 fisher yates 是最无偏的洗牌算法吗?您如何解释数组中的每个元素都有 1/n 的概率位于其原始位置? 最佳答案 给定一个完美的伪随机数生成器(Mersenne Twister
JS 新手,目前正在大学学习。对于我当前的 JS 项目,我正在构建一个内存卡游戏。我开始思考如何随机洗牌,并且我接近了 Fisher-Yates Shuffle 算法的作用 - this page 上
我正在 exercism.io 中进行练习,其中我必须为机器人生成随机名称。我能够通过大量测试,直到达到此测试: [Fact] public void Robot_names_are_unique()
我正在编写的一些代码遇到了一些问题。基本上,我试图像一副纸牌一样“洗牌”堆栈集合,但由于某种原因,我使用的临时堆栈之一不会完全清空,这会在下次运行时导致空集合异常大约。我手动跟踪了代码和输出,元素被留
假设 Math.random() 生成 0 到 1 之间均匀分布的随机数,这是 Fischer Yates shuffle 的正确实现吗?我正在寻找一个非常随机、均匀的分布,其中可以指定输入数组 (a
所以我尝试利用 Fisher-Yates 算法对数组的元素进行洗牌。然后我想将这个“洗牌”数组插入另一个数组中。我的目标是创建一个包含特定数量的“洗牌”数组的数组。 例如: var myInput =
我正在尝试重现 Fisher-Yates 算法来对数组进行适当的洗牌: ref1: Coding Horror ref2: Eli Bendersky 问题是,当我运行“天真的”洗牌的第一步时,我的结
我一直在问关于随机数的问题,我认为 Fisher-Yates shuffle 是最好的选择。我做了一张 table 't' t = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 现在,
我正在尝试创建一个控制台程序来模拟有一副纸牌,用户应该能够; 随机抽取一些卡片 洗牌 将牌组恢复到原来的状态 我正在努力想办法让牌组回到起点 当我尝试再次使用初始化数组时; string[] Deck
我是一名优秀的程序员,十分优秀!