我面临着将 char 放在随机位置的问题。
我有一张满是点的表格,我必须用 *
替换其中 30% 的点
尺寸:10x5
我使用函数 Random
。
Random rnd = new Random();
if (rnd.Next() % 10 > 3)
Console.Write(". ");
else
Console.Write("* ");
一切都在 2 个循环中,其中包含表格的长度和高度 (10x5)。
但是生成 *
而不是 的概率只有 30%。
它占据了很好的位置,但每次我启动一个程序时,*
的数量都不一样。
每次启动程序时它应该只有 16 个 *
(17 - 如果四舍五入)
我应该如何假设总是赚取 30% 而不是概率?
最佳答案
你有 50 个点。计算50*30/100
,变成15。
然后生成 0 到 50 范围内的 15 个唯一随机数。这些数字是您必须将 .
替换为 *
var indexes = Enumerable.Range(0,50).OrderBy(x => rng.Next()).Take(50*30/100).ToList();
如果您正在使用 2d 索引,将 1d 索引转换为 2d 索引相当容易。
var i = index % 5;
var j = index / 5;
根据@KonradRudolph 所说,如果您不想使用 OrderBy,您可以查看此处发布的其他随机排列数组(或创建随机集合)的方法 Best way to randomize an array with .NET
Here is more efficient way using Fisher-Yates algorithm我建议你使用而不是使用 OrderBy
var indexes = Enumerable.Range(0, 50).ToArray();
RandomExtensions.Shuffle(rng, indexes);
关于c# - 随机位置的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42902328/