C # Замена каждого слова случайным образом сгенерированной строки - PullRequest
0 голосов
/ 31 мая 2018

Здравствуйте, люди из StackOverFlow, у меня проблема с кодом ошибки, который я написал ниже.У меня вопрос, как я могу заменить каждое из этих слов ниже случайно сгенерированной строки.

Моя проблема в том, что приведенный ниже код прямо сейчас заменяет все слова случайным образом, но все они одинаковы, и я хочу заменить каждое из них случайно сгенерированной строкой, но не все они одинаковы ..

Я использовал эту строку несколько раз в ресурсах, поэтому.

Мои слова, которые у меня есть в ресурсе: "basenet", "R02", "R01", "R03", "R0"," vistubularcut "," naturalipad "," braskausa "," moonsteelir "," dubilomo "

мой код:

public string RandomGen1(int a1, Random random) {
  StringBuilder result1 = new StringBuilder(a1);
  string characters = textBox1.Text;
  for (int i = 0; i < numericUpDown1.Value; i++) {
    result1.Append(characters[random.Next(characters.Length)]);
  }
  return result1.ToString();
}

private void button1_Click(object sender, EventArgs e) {
    Random rnd = new Random();
    string[] gen1 = new string[1];
    for (int a = 0; a < gen1.Length; a++) {
      gen1[a] = RandomGen1(1, rnd);
      string source = (String.Join(Environment.NewLine, gen1));
      string executionerv2 = Properties.Resources.String1;

      string[] replace1 = {
        "basenet",
        "R02",
        "R01",
        "R03",
        "R0",
        "vistubularcut",
        "naturalipad",
        "braskausa",
        "moonsteelir",
        "dubilomo"
      };

      foreach (string curr in replace1) {
        executionerv2 = executionerv2.Replace(curr, source);
      }
    }

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

String.Replace(string, string) заменит каждый экземпляр первого слова параметра вторым словом параметра.Если вы хотите, чтобы каждый отдельный экземпляр одного и того же слова заменялся другой строкой, вам придется отделить слово строки, выполнить итерацию по ним, и каждый раз, когда вы найдете слово, которое хотите заменить, замените его случайной строкой.

Вот пример (при условии, что у вас уже есть метод для получения случайного слова):

string Source = "The quick brown fox jumps over the lazy dog.\r\nThe quick brown fox jumps over the lazy dog.";
string[] ReplaceWords = { "quick", "fox", "lazy", "dog" };

string[] SourceWords = Source.Split(' ');
string result = "";
for (int i = 0; i < SourceWords.Length; i++)
{
    if (ReplaceWords.Contains(SourceWords[i]))
        result += " " + GetRandomWord();
    else
        result += " " + SourceWords[i];
}
result = result.Trim() //Remove white spaces at the begining and end of the string.

result = "The fdhs brown fdsfsd jumps over the hgfih turioutro.\r\nThe cxnvcxn brown oipuop jumps over the rewrre kmlçnlç."

Таким образом, каждый экземпляр слова «быстрый»«fox», «lazy» и «dog» будут заменены другой строкой.В моем примере я, очевидно, только случайным образом нажимаю на клавиатуру, чтобы проиллюстрировать свою точку зрения, но если у вас есть функция GetRandomWord, которая получает существующие слова из списка, она тоже будет работать:

result = "The tree brown house jumps over the grass shell.\r\nThe hidrant brown mushroom jumps over the ocean skateboard."

Все мои примеры отсталые, но они иллюстрируют мою точку зрения.

Надеюсь, я помог:)

Просто ради интереса

Если вы сделаете GetRandomWord, товыбирает слова из существующих списков И это с учетом контекста, вы можете получить предложения, которые могут действительно иметь смысл.

Давайте создадим enum для наших контекстов.Для простоты ... Давайте просто сделаем это просто:

enum Context
{
    Adjective,
    Noun
}

Теперь давайте создадим наши списки:

string[] Nouns = {"dog", "cat", "fox", "horse", "bird"};
string[] Adjectives {"lazy", "sleepy", "quick", "big", "small"};

Теперь для нашего метода:

string GetRandomWord(Context c)
{
    Random R = new Random();
    switch (c)
    {
        case Context.Noun:
            return Nouns[R.Next(0, Nouns.Length)];
            break;
        case Context.Adjective:
            return Adjectives[R.Next(0, Adjectives.Length)];
            break;
    }
}

Теперь небольшое изменение в тексте, заменяющем код:

string Source = "The quick brown fox jumps over the lazy dog.\r\nThe quick brown fox jumps over the lazy dog.";
string[] ReplaceAdjectives = { "quick", "lazy" };
string[] ReplaceNouns = { "fox", "dog" };

string[] SourceWords = Source.Split(' ');
string result = "";
for (int i = 0; i < SourceWords.Length; i++)
{
    if (ReplaceAdjectives.Contains(SourceWords[i]))
        result += " " + GetRandomWord(Context.Adjective);
    else if (ReplaceNouns.Contains(SourceWords[i]))
        result += " " + GetRandomWord(Context.Noun);
    else
        result += " " + SourceWords[i];
}
result = result.Trim() //Remove white spaces at the begining and end of the string.

result = "The sleepy brown bird jumps over the small horse.\r\nThe lazy brown cat jumps over the sleepy dog."

Как я уже сказал, полученное случайное предложение МОЖЕТ иметь некоторый смысл.Но, по крайней мере, это будет иметь некоторый смысл с точки зрения синтаксиса.

Поскольку наши списки соответствуют указателям на существительные с соответствующими им прилагательными, создающими смысл, мы можем также изменить код, чтобы получить случайные результатыэто гарантированно имеет смысл.

Все, что нам нужно сделать, - это создать новый метод с именем GetMatchingWord(Context, int).Он принимает int, потому что он больше не рандомизирует выбор слова сам по себе.Теперь это делается в вызывающем методе.

string GetMatchingWord(Context c, int i)
{
    switch (c)
    {
        case Context.Noun:
            return Nouns[i];
            break;
        case Context.Adjective:
            return Adjectives[i];
            break;
    }
}

Затем мы соответствующим образом модифицируем наш код:

string Source = "The quick brown fox jumps over the lazy dog.\r\nThe quick brown fox jumps over the lazy dog.";
string[] ReplaceAdjectives = { "quick", "lazy" };
string[] ReplaceNouns = { "fox", "dog" };

bool GuaranteeMatch = true;

string[] SourceWords = Source.Split(' ');
string result = "";
Random R = new Random();
for (int i = 0; i < SourceWords.Length; i++)
{
    if (GuaranteeMatch)
    {
        int I = R.Next(0, Adjectives.Length) //Adjectives and Nouns have the same Length. This is a requirement for this method to work.
        if (ReplaceAdjectives.Contains(SourceWords[i]))
            result += " " + GetMatchingWord(Context.Adjective, I);
        else if (ReplaceNouns.Contains(SourceWords[i]))
            result += " " + GetMatchingWord(Context.Noun, I);
        else
            result += " " + SourceWords[i];
    }
    else
    {
        if (ReplaceAdjectives.Contains(SourceWords[i]))
            result += " " + GetRandomWord(Context.Adjective);
        else if (ReplaceNouns.Contains(SourceWords[i]))
            result += " " + GetRandomWord(Context.Noun);
        else
            result += " " + SourceWords[i];
    }
}
result = result.Trim() //Remove white spaces at the begining and end of the string.

Теперь, если GuaranteeMatch истинно, мы всегда будем получать результаты, такие как:result = "The big brown horse jumps over the sleepy cat.\r\nThe lazy brown dog jumps over the small bird."

Он даже сможет вернуть исходное предложение, поскольку заменяемые слова также существуют в списках слов, чтобы заменить их на.

0 голосов
/ 31 мая 2018

Вы можете использовать Random для генерации случайных чисел, преобразования их в char и добавления к string.

private string RandomString(int length)
    {
        Random rdn = new Random();
        string toReturn = string.Empty;
        while (length > 0)
        {
            toReturn += (char)rdn.Next(65, 90);
            length--;
        }

        return toReturn;
    }

Я выбрал диапазон на основе таблицы ASCII: https://www.asciitable.com/ Если вам также нужен случайный length, просто создайте новый экземпляр Random в вызывающем методе.

РЕДАКТИРОВАТЬ:

На основе комментариев, вот лучший способ сделать это.

private static Random rdn = new Random();
private string RandomString(int length)
{
    return new string((char)rdn.Next('A', 'Z'), length);
}

Наконец, вы можете просто написать: replace1[index] = RandomString(4);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...