Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 随机位置字符_C#_Random - Fatal编程技术网

C# 随机位置字符

C# 随机位置字符,c#,random,C#,Random,我面临着把字符放在随机位置的问题 我有一张满是点的表格,我必须用* var indexes = Enumerable.Range(0,50).OrderBy(x => rng.Next()).Take(50*30/100).ToList(); 尺寸:10x5 我使用了函数Random Random rnd = new Random(); if (rnd.Next() % 10 > 3) Console.Write(". "); else Console.Writ

我面临着把字符放在随机位置的问题

我有一张满是点的表格,我必须用
*

var indexes = Enumerable.Range(0,50).OrderBy(x => rng.Next()).Take(50*30/100).ToList();

尺寸:10x5

我使用了函数
Random

Random rnd = new Random();

if (rnd.Next() % 10 > 3)
    Console.Write(". ");
else
    Console.Write("* ");
所有东西都在2个环中,可容纳桌子的长度和高度(10x5)

但它只使30%的概率成为
*
而不是

它的位置很好,但每次我启动一个程序时,
*
的数量都不同

每次我启动程序时,它应该只有16个
*
(17-如果四舍五入)


我应该如何假设30%总是代替概率?

编写代码,执行以下操作:

  • 声明包含x*y元素的数组
  • 在整个阵列中填充
  • 声明迭代次数为0.30*x*y的循环
  • 对于每个迭代,从中更改随机选择的元素。到*(您必须继续查找,直到找到一个尚未成为*)
  • 输出数组,每行x个元素

  • 编写执行以下操作的代码:

  • 声明包含x*y元素的数组
  • 在整个阵列中填充
  • 声明迭代次数为0.30*x*y的循环
  • 对于每个迭代,从中更改随机选择的元素。到*(您必须继续查找,直到找到一个尚未成为*)
  • 输出数组,每行x个元素

  • 你有50个点。计算
    50*30/100
    ,它变为15

    然后在0到50的范围内生成15个唯一的随机数。这些数字是您必须用
    *

    var indexes = Enumerable.Range(0,50).OrderBy(x => rng.Next()).Take(50*30/100).ToList();
    
    如果您使用的是二维索引,那么将一维索引转换为二维索引相当容易

    var i = index % 5;
    var j = index / 5;
    
    根据@KonradRudolph所说的,如果您不想使用OrderBy,您可以查看这里发布的其他方法来洗牌数组(或创建随机集)

    我建议您使用,而不是使用OrderBy

    var indexes = Enumerable.Range(0, 50).ToArray();
    RandomExtensions.Shuffle(rng, indexes);
    

    你有50个点。计算
    50*30/100
    ,它变为15

    然后在0到50的范围内生成15个唯一的随机数。这些数字是您必须用
    *

    var indexes = Enumerable.Range(0,50).OrderBy(x => rng.Next()).Take(50*30/100).ToList();
    
    如果您使用的是二维索引,那么将一维索引转换为二维索引相当容易

    var i = index % 5;
    var j = index / 5;
    
    根据@KonradRudolph所说的,如果您不想使用OrderBy,您可以查看这里发布的其他方法来洗牌数组(或创建随机集)

    我建议您使用,而不是使用OrderBy

    var indexes = Enumerable.Range(0, 50).ToArray();
    RandomExtensions.Shuffle(rng, indexes);
    

    想象一下你的数组只有50个元素,暂时忘记矩形的形状。你会怎么做?声明X点和50-X星,然后随机排序。就像你随机排列一个1->50的数字列表一样

    现在如何随机排列1->50个数字的列表?一个简单直观的方法是想象洗牌。通过循环,在1->50中为每个位置获得一个随机数。选择交换元素(比如,对于i=1,我们得到了随机数7=>交换元素1和7)


    在这里,您只需要将这个矩形映射到这50个点,这对于2D来说已经足够简单了。

    将您的数组想象为只有50个元素,现在就忘掉矩形形状。你会怎么做?声明X点和50-X星,然后随机排序。就像你随机排列一个1->50的数字列表一样

    现在如何随机排列1->50个数字的列表?一个简单直观的方法是想象洗牌。通过循环,在1->50中为每个位置获得一个随机数。选择交换元素(比如,对于i=1,我们得到了随机数7=>交换元素1和7)


    在这里,您只需要将这个矩形映射到这50个点,这对于2D来说已经足够简单了。

    我会随机选择30%的可能位置

    // create char array
    int arrayRows = 5;
    int arrayCols = 10;
    char[,] arr= new char[arrayRows ,arrayCols];
    
    // populate array with dots
    for (int i = 0; i < arrayRows; i++)
    {
     for (int j = 0; j < arrayCols; j++)
      {
      arr[i,j] = '.';
      }
    }
    
    Random rnd = new Random();
    
    int numberOfPossiblePositions = arrayRows * arrayCols;
    
    int k = 0;
    while (k < numberOfPossiblePositions * 0.3) {
     int position = rnd.Next(numberOfPossiblePositions);
    
     int colIndex = position / 10;
     int rowIndex = position % 10;
    
     // if the cell already has * try again
     if (arr[rowIndex,colIndex] == '*') {
       continue;
     }
    
     arr[rowIndex,colIndex] = '*';
     k++;
    }
    
    //创建字符数组
    int arrayRows=5;
    int-arrayCols=10;
    char[,]arr=新字符[arrayRows,arrayCols];
    //用点填充数组
    for(int i=0;i
    我会随机选择30%的可能职位

    // create char array
    int arrayRows = 5;
    int arrayCols = 10;
    char[,] arr= new char[arrayRows ,arrayCols];
    
    // populate array with dots
    for (int i = 0; i < arrayRows; i++)
    {
     for (int j = 0; j < arrayCols; j++)
      {
      arr[i,j] = '.';
      }
    }
    
    Random rnd = new Random();
    
    int numberOfPossiblePositions = arrayRows * arrayCols;
    
    int k = 0;
    while (k < numberOfPossiblePositions * 0.3) {
     int position = rnd.Next(numberOfPossiblePositions);
    
     int colIndex = position / 10;
     int rowIndex = position % 10;
    
     // if the cell already has * try again
     if (arr[rowIndex,colIndex] == '*') {
       continue;
     }
    
     arr[rowIndex,colIndex] = '*';
     k++;
    }
    
    //创建字符数组
    int arrayRows=5;
    int-arrayCols=10;
    char[,]arr=新字符[arrayRows,arrayCols];
    //用点填充数组
    for(int i=0;i
    创建一个包含x*y/3起始点的数组,其余为点。按随机顺序排序,然后遍历它

    这是阵列:

    Enumerable.Range(0, count).Select(i => new {Text = "*", Order = rnd.Next() })
         .Concat(Enumerable.Range(0, x*y - count)
         .Select(i=>new { Text = ".", Order = rnd.Next() }))
    .OrderBy(i => i.Order).Select(i=>i.Text).ToList();
    
    这是迭代的代码:

    Random rnd = new Random();
    int x = 10;
    int y = 5;
    int count = x*y/3;
    var allPlaces =
                Enumerable.Range(0, count).Select(i => new {Text = "*", Order = rnd.Next() })
                    .Concat(Enumerable.Range(0, x*y - count)
                    .Select(i=>new { Text = ".", Order = rnd.Next() }))
                .OrderBy(i => i.Order).Select(i=>i.Text).ToList();
    
    for (var i = 0; i < x; x++)
    {
        for (var j = 0; j < y; j++) { Console.Write(allPlaces[i*j + j]); } 
        Console.WriteLine();
    }
    
    Random rnd=new Random();
    int x=10;
    int y=5;
    整数计数=x*y/3;
    var allPlaces=
    Enumerable.Range(0,count)。选择(i=>new{Text=“*”,Order=rnd.Next()})
    .Concat(可枚举的.Range(0,x*y-计数)
    .Select(i=>new{Text=“.”,Order=rnd.Next()}))
    .OrderBy(i=>i.Order).Select(i=>i.Text.ToList();
    对于(变量i=0;i
    创建一个包含x*y/3起始点的数组,其余为点。按随机顺序排序,然后遍历它

    这是阵列:

    Enumerable.Range(0, count).Select(i => new {Text = "*", Order = rnd.Next() })
         .Concat(Enumerable.Range(0, x*y - count)
         .Select(i=>new { Text = ".", Order = rnd.Next() }))
    .OrderBy(i => i.Order).Select(i=>i.Text).ToList();