实现数组随机随机

时间:2016-07-11 01:50:23

标签: arrays multidimensional-array random generator pseudocode

前奏

我正在编写一个基于网格的随机地图生成器。 目前,我想用各种图块填充2D数组。

问题

在括号中是一个更具体的例子。

以下是给出的内容:

  • 2D阵列及其尺寸。 (即3x4网格)
  • Integer Random(Range)(即范围:0-11,输出:0-11之间的整数)
    • 你做 NOT 有一个随机排序数组的函数,除非你自己实现
  • 每种瓷砖的数量(即沙漠:2,湖:4,福雷斯特:6)

如何使用给定的图块填充此数组?

实施例

3x4地图; 6 F orrest; 4 L ake; 2 D esert ...

F F L
L D F
D F F
L F L

尝试

我确实拥有自己的实现,但我认为它的Big-O是......无穷大。 :)

当然,它永远不会完成的可能性很小;然而,这是视频游戏的一部分,我不想让玩家等待。

后记

我真的不在乎它实施的语言是什么;伪代码会令人满意。

2 个答案:

答案 0 :(得分:0)

这可能是其中一种方法。

#include<iostream>
#include <cstdlib>
#include <map>

using namespace std;
//Map which keeps the value for each key (2,4,6) 
map<int,char> alphabet;
void initMap()
{
alphabet[2] = 'D';
alphabet[4] = 'L';
alphabet[6] = 'F';
} 


int main()
{
   char a[3][4];
   // counter variables to keep track of d,f and l
   int temp,d=0,f=0,l=0;
   initMap();

   for(int i=0;i<3;i++)
   {
      for(int j=0;j<4;j++)
      {
        //This determines if the generated random number is already entered in the grid. If no than breaks out. If yes than again a new random number is generated and process is iterated untill the new number is found to enter
        while(1)
        {
            temp = rand()%4;
            if(temp==0)
            {
                temp = 2;
            }
            else
            {
                temp = temp*2;
            }

            if(temp ==2 && d<2)
            {
                d++;
                break;
            }
            else if(temp ==4 && l<4)
            {
                l++;
                break;
            }
            else if(temp ==6 && f<6)
            {
                f++;
                break;
            }
            else
            {
                continue;
            }
        }
        //char value for the number temp is assigned from the alphabet map
       a[i][j]  = alphabet.at(temp);
       cout<<a[i][j]<<"  ";
     }
   cout<<endl;
 }
 return 0;
}

输出:

D  F  L  D
L  L  L  F
F  F  F  F

输入值或从数组中访问值时,您可以根据数字映射字母。

答案 1 :(得分:0)

  1. 确保输入正确(例如,瓷砖的总数等于 网格中的插槽数量)
  2. 将所有给出的牌块放入队列Q中,队列Q的长度为n(在你的队列中) 例如,n = 12)
  3. 初始化结果数组R [p],p初始化为0
  4. 得到k =随机(1&gt; n),deque Q [k]到R [p],p ++
  5. 重复步骤4直到p进入n
  6. 如果您使用具有内置排序功能的语言,事情就会轻松得多:

    1. 验证输入
    2. 将给定的瓷砖放入一个维度阵列A [n]
    3. 随机排序A [n]
    4. C#中的代码:

          int m = 3;
          int n = 4;  //m*n grid
      
          int forrests = 6;
          int lakes = 4;
          int deserts = 2;
      
          if (m * n != forrests + lakes + deserts)
          {
              //invalid input!
          }
      
          char[] tiles = new char[m * n];
          for (int i = 0; i < m * n; i++)
          {
              if (i < forrests)
              {
                  tiles[i] = 'F';
              }
              else if (i < forrests + lakes)
              {
                  tiles[i] = 'L';
              }
              else
              {
                  tiles[i] = 'D';
              }
          }
      
          //preparation completed, now tiles[] looks like 
          //F,F,F,F,F,F,L,L,L,L,D,D
      
          char[] output = tiles.OrderBy(t => Guid.NewGuid()).ToArray();
          //output is randomly sorted from tiles
      
          //if you really need a two-demension array
          char[][] map = new char[n][];
          for (int i = 0; i < n; i++)
          {
              map[i] = output.Skip(m * i).Take(m).ToArray();
          }