C# 生成包含随机单词的字符串

C# 生成包含随机单词的字符串,c#,random,permutation,C#,Random,Permutation,我需要写一个函数,将随机我的字符串的一些字。例如: [Hello|Hi] guys. This is my [code|string] 该函数应返回: 大家好。这是我的代码 或 大家好。这是我的字符串您可以得到如下随机数生成器: var rand=new Random() 至于解析字符串并获取所有选项,我建议您查看System.Text.RegularExpressions 到目前为止的其他答案只是展示了如果您已经为不同的占位符提供了一个或两个选项,那么如何获得一个随机字符串。这些都很好,但写

我需要写一个函数,将随机我的字符串的一些字。例如:

[Hello|Hi] guys. This is my [code|string]
该函数应返回:

大家好。这是我的代码


大家好。这是我的字符串

您可以得到如下随机数生成器:

var rand=new Random()

至于解析字符串并获取所有选项,我建议您查看
System.Text.RegularExpressions

到目前为止的其他答案只是展示了如果您已经为不同的占位符提供了一个或两个选项,那么如何获得一个随机字符串。这些都很好,但写出来却相当枯燥乏味。更好的方法是编写一个解析器,它可以像OP所给的那样获取随机字符串“模板”,并使用它来生成随机字符串

下面是我总结的一个简单例子:

using System;
using System.Text.RegularExpressions;

namespace StackOverLoadTest {
static class Program {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main() {
        var s = new RandomString("[Hey|Hi] guys. [I|You|We|He|She] should [walk] to the [park|field|farm] sometime [today|tomorrow|next week].");
        for (int i = 0; i < 10; i++)
            Console.WriteLine(s);
    }
}

public class RandomString {
    private Random _rnd = new Random();
    private static Regex _rex = new Regex(@"\[ ( \|?  (?<option>[^]|]+) )+ \]", System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace | System.Text.RegularExpressions.RegexOptions.ExplicitCapture);
    string _template;
    public RandomString(string template) {
        _template = template;
    }
    public override string ToString() {
        return _rex.Replace(_template, GetRandomOption);
    }
    public string GetRandomOption(Match m) {
        var options = m.Groups["option"].Captures;
        int choice = _rnd.Next(0, options.Count);
        return options[choice].Value;
    }
}
}
使用系统;
使用System.Text.RegularExpressions;
命名空间堆栈重载测试{
静态类程序{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main(){
var s=new RandomString(“嗨,大家好。[我|你们|我们|他|她]应该在[今天|明天|下周]的某个时候[步行]去[公园|田野|农场]”;
对于(int i=0;i<10;i++)
控制台。写入线(s);
}
}
公共类随机字符串{
私有随机数=新随机数();
private static Regex\u rex=new Regex(@“\[(\\\;?(?[^]\]+)+\]”,System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace | System.Text.RegularExpressions.RegexOptions.ExplicitCapture);
字符串模板;
公共随机字符串(字符串模板){
_模板=模板;
}
公共重写字符串ToString(){
返回_rex.Replace(_模板,GetRandomOption);
}
公共字符串GetRandomOption(匹配m){
var options=m.Groups[“option”]。捕获;
int choice=_rnd.Next(0,options.Count);
返回选项[choice]。值;
}
}
}
如您所见,您可以使用该模板创建一个新的RandomString对象。然后,只需调用ToString()函数,每次调用的次数都是您想要的,每次都会得到一个新的随机选项排列

您可以将任意数量的占位符与任意数量的选项一起使用(0除外)。 我在本例中使用的字符串模板是:

[嘿|嗨]伙计们。[我|你们|我们|他|她]应该[走路][公园|田野|农场]某个时间[今天|明天|下周]

运行上面的代码,我得到了以下结果:



嘿,伙计们我今天应该在某个时间步行到公园
大家好我们今天应该什么时候步行去农场 大家好他应该在下周的某个时间步行到场地 嘿,伙计们你应该在下周的某个时间步行去公园 大家好她应该在下周的某个时候步行去农场 嘿,伙计们我们应该走到场地明天的某个时间
大家好我今天应该什么时候步行去农场 嘿,伙计们应该在明天的某个时间步行场地 大家好你应该在下周的某个时间步行去公园 大家好我今天应该什么时候步行去农场

试试这个:

private string randArr(String[] _arr)
{
    Random _rnd = new Random(DateTime.Now.GetHashCode());
    return _arr[_rnd.Next(_arr.length)];
}
只需调用它,为字符串值提供数组。像这样:

String.Format("{0} guys. This is my {1}", randArr(["Hello","Hi"]), randArr(["code","string"]));
我采用了这种方法:

Random rand = new Random();
int val = rand.Next(0, 100);
Console.WriteLine(
    "{0} guys. This is my {1}",

    val >= 50 ? "Hi" : "Hello",
    val < 50 ? "code" : "string");
Random rand=new Random();
int val=rand.Next(01100);
控制台写入线(
“{0}伙计们,这是我的{1}”,
val>=50?“你好”:“你好”,
val<50?“代码”:“字符串”);
我给了一个50%-50%的机会来判断单词是怎么写的,所以这就是你看到的
=50
&
<50
您可以更改它。

如果你想随机化每个单词,而不是完整的句子(上面的代码只提供了两种变体),只需修改代码或注释我就可以了

注:

这实际上不是50%-50%。我不想混淆,但是如果你想这样做,第一个条件应该是
=49
*


条件的语法(
condition?statement:statement
)被调用。

这被称为置换…你希望它有时随机地说“你好”,有时随机地说“你好”,而“code”和“string”也是如此?是的…如果val正好是50会发生什么?@florispijt True,我马上编辑它!谢谢你指出这一点。这将两个结果联系在一起。您将始终拥有Hello+字符串或Hi+代码。其他组合将永远不会显示,因为两个组合使用相同的随机值。@Flater,正如我在第二段中所说的。我不确定,所以我把它留给OP来评论我。你确定这就是他想要的吗?不管怎样,你的选项都会显示原始问题中未提及的两个结果,使用此代码段无法接收特定请求的两个输出。不过,无意冒犯,它通常是可靠的编程:)最佳和最可插拔的答案。哦,嘿,很好地使用了
Replace
。比我想要的简单多了。谢谢。事实上,你可以工作