如何在PHP中生成*&#的随机模式

时间:2017-11-07 11:38:50

标签: php logic

你好,我正在制作一个程序,让我帮助生成一个具有指定限制的随机字符串和*&#的随机字符串,但是*&#的组合不应该重复。

例如:如果输入3,那么O / P应为

#**
**#
**#

它应该生成一个长度为3到3行的随机字符串,不同的模式也不应该重复。我使用的是以下代码,但无法实现。

$n = 3;
for($i = 0; $i < n; $i++)
  {
     for($j=0;$j<=$n;j++)
       {
          echo "*#";
       }
     echo "<br />";
  }

但是我无法生成输出,我的逻辑失败在哪里?

3 个答案:

答案 0 :(得分:1)

如果要确保相同的模式不会出现多次,则必须保留生成的字符串的记录。在最基本的形式中,它可能看起来像这样:

public function generate() {
    $amount = 3;  // The amount of strings you want.
    $generated_strings = []; // Keep a record of the generated strings.
    do {
        $random = $this->generateRandomString(); // Generate a random string
        if(!in_array($random, $generated_strings)) { // Keep the record if its not already present.
            $generated_strings[] = $random;
        }
    } while(sizeof($generated_strings) !== $amount); // Repeat this process until you have three strings.

    print_r($generated_strings);
}


public function generateRandomString($length = 3) {
    $characters = '*&#';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

答案 1 :(得分:1)

您可以使用while循环和数组来执行此操作。
我首先有一个可能有字符的数组 然后我循环直到结果数组需要长度。
我使用数组唯一来删除循环内的任何重复。
我使用rand(0,2)从可能的字符数组中“选择”一个随机字符。

$arr = ["*", "&", "#"];
$res = array();

$n =7;

While(count($res) != $n){
    $temp="";
    For($i=0;$i<$n;$i++){
         $temp .= $arr[Rand(0,count($arr)-1)];
    }
    $res[] = $temp;
    $res = array_unique($res);
}

Var_dump($res);

https://3v4l.org/Ko4Wd

更新了超出OP未明确规定的范围细节。

答案 2 :(得分:1)

不一定是最优化的算法,但它应该有效。

我正在使用一个字符串生成器,有点随机,结合你提供的字符。第二部分是使用生成的字符串填充输出数组。

<?php

function randomize($n) {
  $s = '';
  for ($i = 0; $i < $n; $i++) {
    $s. = (rand(0, 10) < 5 ? '*' : '#');
  }
  return $s;
}


$n = 3;
$output = array();
for ($i = 0; $i < $n; $i++) {
  $tmp = randomize($n);
  while (in_array($tmp, $output)) {
    $tmp = randomize($n);
  }
  $output[] = $tmp;
}
print_r($output);

Visible here