Delphi 如何生成一定数量的数字并将其随机分布在网格中?

Delphi 如何生成一定数量的数字并将其随机分布在网格中?,delphi,pascal,Delphi,Pascal,我想生成数25次,数110次。我试图在Delphi中通过字符串网格随机分布这些内容。我还想用0填充不是1或2的网格的其余部分。我甚至不知道如何从这里开始 它看起来像这样(p代表玩家,只有5个2和10个1):给定一个尺寸为m×n的网格,创建一个长度为m*n的数组。在数组中放入5个2和10个1,并用0填充其余部分。(我们假设m和n的乘积至少为15。)洗牌数组。将洗牌数组中的每个元素复制到网格中的连续单元格中。而Robs answer中表示的方法可以完成这项工作,我个人认为,就其目的而言,这是一种复杂

我想生成数25次,数110次。我试图在Delphi中通过字符串网格随机分布这些内容。我还想用0填充不是12的网格的其余部分。我甚至不知道如何从这里开始


它看起来像这样(p代表玩家,只有5个2和10个1):

给定一个尺寸为m×n的网格,创建一个长度为m*n的数组。在数组中放入5个2和10个1,并用0填充其余部分。(我们假设m和n的乘积至少为15。)洗牌数组。将洗牌数组中的每个元素复制到网格中的连续单元格中。

而Robs answer中表示的方法可以完成这项工作,我个人认为,就其目的而言,这是一种复杂的方法

那么,哪种方法更简单呢

你们的目标是把这些数字放在网格中的随机位置

如何确定某个对象在栅格中的位置?您可以通过它的X(列)和Y(行)坐标来完成

那么,如何获得网格中的随机位置呢?Simple为X和Y坐标选择了两个随机值


至于放置数字1和数字2的某些数字,请使用两个简单的循环

到目前为止你做了什么?你到底有什么问题?是否创建要显示的编号列表?洗牌名单?将数字写入网格?我已经创建了列表并初始化了它们(1个数组表示25次,1个数组表示110次)。我只是不知道如何将它们随机写入网格。将网格的所有坐标放入一个数组中。用Fisher Yates Shuffle洗牌。用2填充前5个洗牌坐标,用1填充后10个,用0填充其余的。我正试图将1分配给数组,但由于某些原因,我一直收到一个错误。我将它分配给一个动态数组,因为用户输入行计数和列计数。我在尝试分配前10个数字时一直遇到的错误是:模块“Project1.exe”中地址00409f9A处的访问冲突。写地址00000000显然你的代码有缺陷。试着调试它。这是迄今为止最有效的前进方式。新手程序员往往不善于调试。我必须使用动态数组,因为用户输入列计数和行计数。当我尝试分配前10个数字时,我遇到以下错误:模块“Project1.exe”中地址00409f9A处的访问冲突。写下地址00000000,这根本不会影响这个答案。看起来您需要进行一些调试。您是否已将阵列设置为需要的大小?(打电话
SetLength
)我知道这不是你的错,我只是在征求意见哈哈。是的,我设置了动态数组的长度。然后我用2表示循环:N:=宝藏[i];多数组[i,j]:=IntToStr(N);除非
j
始终为0,否则最终将达到用于索引网格的
i
超出数组边界的点。但这不会导致地址0的访问冲突。你在其他地方有一个空指针。打开范围检查,打开溢出检查,然后使用调试器。你在Internet上找不到任何关于洗牌数组的信息吗?我不相信你。仅在这个网站上就有近3000个问题。去再试一次。或者参考你的课本。或者问问你的老师,我不知道这有多简单。你是如何衡量简单性的?(顺便说一句,你的方法是错误的,因为它没有考虑到你选择的位置在上一次迭代中已经被填充的情况。我的方法不受这种情况的影响。)@这可以通过一个简单的检查来解决,看看那些随机坐标下的单元格是否为空。这是一个我的方法不需要担心的检查。你如何衡量简单性?我最终用Rob的方法算出了。洗牌是一件痛苦的事,但我在大约3个小时后发现了如何洗牌。我本来打算用你的方法,但我不知道如何选择随机坐标来放置它们。现在,我将坚持Rob的方法,但如果我遇到任何问题,我将切换。谢谢您的回答。@silver您没有提到的是您需要检查您是否已经绘制了坐标。所以你最终会循环。如果您需要填充网格,那么这可能会有点浪费。这肯定比简单的洗牌更复杂。