c# - 随机位置的字符

标签 c# random

我面临着将 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/

相关文章:

c# - IronScheme 无法完成哪些要求?

c# - 是否可以使用 SaveAsDialogBox 保存带有图标的文件?

java - 使用随机长整型生成随机 double

python - 根据属性选择列表中的随机元素

javascript - 如何使网站中的图片随机变化?

c# - C++ 和 C# 速度测试 - 奇怪的结果

c# - 如何获取word文档封面的名字?

javascript - 生成随机唯一数据花费的时间太长并且占用 100% CPU

JavaScript - 如何获得第三个 "sub variable"

c# - Azure 搜索 SDK 正则表达式?