C# 有没有办法将一个字符串随机分成不同的字符串数组,然后返回相同的字符串
比如我有C# 有没有办法将一个字符串随机分成不同的字符串数组,然后返回相同的字符串,c#,string,c#-4.0,random,C#,String,C# 4.0,Random,比如我有 String Text = "ABCDEFGHIJKLMNOPQ"; 运行一些代码以进入 String[] text1 = "AOCN"; String[] text2 = "JQBF"; String[] text3 = "DMG"; String[] text4 = "HPI"; String[] text5 = "KEL"; 然后用一些代码把它恢复到 String Text=“ABCDEFGHIJKLMNOPQ” 这可能吗? 我试图实现的是将溢出的字符随机存储到5个不同的字符
String Text = "ABCDEFGHIJKLMNOPQ";
运行一些代码以进入
String[] text1 = "AOCN";
String[] text2 = "JQBF";
String[] text3 = "DMG";
String[] text4 = "HPI";
String[] text5 = "KEL";
然后用一些代码把它恢复到
String Text=“ABCDEFGHIJKLMNOPQ”
这可能吗?
我试图实现的是将溢出的字符随机存储到5个不同的字符串数组中,并使用代码将其还原为原始文本是的,您可以逐个字符进行迭代:
using System;
class Program
{
static void Main()
{
const string s = "Hello!";
// Option 1
foreach (char c in s)
{
Console.WriteLine(c); // Your treatment here
}
// Option 2
for (int i = 0; i < s.Length; i++)
{
Console.WriteLine(s[i]); // Your treatment here
}
}
}
然后在这里的治疗中,你可以使用C#提供的基本随机函数。只要不更改种子
,就可以检索用于生成子字符串的序列,并可能将其还原
举例来说,可以是这样的:
int seed = 12;
List<int> lst = new List<int>();
// Repeat that until you processed the whole string
// At the mean time, skip the characters already indexed
while (lst.Count != s.Length) {
int n = new Random(seed).Next(0, s.Length);
if (!lst.Contains(n)) {
text1 += s[n];
lst.Add(n);
}
}
int-seed=12;
List lst=新列表();
//重复该操作,直到处理整个字符串为止
//同时,跳过已编入索引的字符
while(lst.Count!=s.Length){
int n=新随机(种子)。下一个(0,s.长度);
如果(!lst.包含(n)){
text1+=s[n];
第1条增补(n);
}
}
最后,lst
是恢复流程的关键
然后,生成子字符串的方式以及恢复原始字符串的算法也取决于您。。。你完全自由了
注意:关于处理
块
,请参考Simon
的答案。对于任意字符串,假设您的分布是真正随机的,那么除非您以某种方式存储了随机因子,否则将无法重新组合原始字符串。这让我想起了只写内存。假设请求将字母“随机”分配到数组是为了一种伪随机(或者,可能是一种表面上任意的)分配,因此是可逆的,实现这一点的一种技术是基本上使用
然后,算法将类似于:
1
到n
的伪随机数流组成,其中n
是要将输入字符串拆分成的字符串数。因此,扩展算法如下所示:
m
的伪随机数列表,p
,其中m
是输入字符串的长度李>
i
,将输入字符串中的i
第个字母指定给输出字符串编号p[i]
i
,从字符串编号p[i]
中的下一个未使用的字母中获取字符串中的i
第个字母static void Main(string[] args)
{
string Text = "ABCDEFGHIJKLMNOPQ";
int chunk = new Random().Next(1,Text.Length/2);
var result= Split(Text,chunk);
Console.WriteLine("Splited:");
foreach (var word in result)
{
Console.WriteLine(word);
}
string toOld = "";
Console.WriteLine("Returned:");
toOld = result.Aggregate((i, j) => i + j);
Console.WriteLine(toOld);
Console.ReadLine();
}
static List<string> Split(string str, int chunkSize)
{
var re = Enumerable.Range(0, str.Length / chunkSize)
.Select(i => str.Substring(i * chunkSize, chunkSize)).ToList() ;
var temp = re.Aggregate((i, j) => i + j);
if (temp.Length < str.Length)
{
var last = re.Last();
last += str.Substring(temp.Length, str.Length - temp.Length);
re[re.Count-1] = last;
}
return re;
}
static void Main(字符串[]args)
{
string Text=“ABCDEFGHIJKLMNOPQ”;
int chunk=new Random().Next(1,Text.Length/2);
var result=Split(文本、块);
控制台。WriteLine(“拆分:”);
foreach(结果中的var字)
{
控制台写入线(word);
}
字符串工具d=“”;
Console.WriteLine(“返回:”);
toOld=结果聚合((i,j)=>i+j);
控制台写入线(toOld);
Console.ReadLine();
}
静态列表拆分(字符串str,int chunkSize)
{
var re=可枚举的范围(0,str.Length/chunkSize)
.Select(i=>str.Substring(i*chunkSize,chunkSize)).ToList();
var temp=骨料((i,j)=>i+j);
如果(温度长度<长度长度)
{
var last=re.last();
最后+=短链子串(短链长度,短链长度-短链长度);
re[re.Count-1]=最后一次;
}
返回re;
}
您可以控制块大小任何内容都可以possible@GrantWinney已编辑问题假设为字符串数组抱歉confusion@GrantWinney这样存储也很好
String[]splitText=new[]{“AOCN”、“JQBF”、…}代码>但我需要能够在起始位置恢复原始字符串为什么要这样做?这是某种加密方案吗?“找回字符串”最简单的方法就是简单地使用原始字符串。你基本上是在要求可逆随机化吗?但是如果它是可逆的,并且有人知道或者可以对你的算法进行反向工程,那么它就不安全,除非你使用某种适当的加密方法。但如果你这样做,你最好只是使用标准库,而不是尝试使用你自己的库…如果你能“返回相同的字符串”,那么它就不是随机的,因为你知道怎么做,然而,随机性是不可预测的。这不是我想要实现的。我想要将拆分的字符随机存储到5个字符串数组中,并能够将其还原为原始文本。您可以使用任何类型的算法,现有算法或自制算法。请放心…我不知道使用的种子是什么这与根本不指定种子
是一样的,但我明确使用了一个常量来警告您,在新的随机
对象上调用.Next()
时,数字序列将始终相同。例如,如果前四次呼叫给出[18,2,5,12]。在一个新的随机对象上调用Next()
四次,在保持相同的种子的同时将再次是[18,2,5,12]。这样您就可以随时检索随机序列,即使您没有将其存储在任何地方。阅读。你提供的代码不是随机化文本,而是随机化文本,我需要的是随机化文本,然后得到相同的文本。当我第一次想到这样做时,我已经想到使用某种密码,但我认为这可能会使我的程序太慢,所以我把它留给最后一种可能的方式,如果伪随机数列表是前基因的话
static void Main(string[] args)
{
string Text = "ABCDEFGHIJKLMNOPQ";
int chunk = new Random().Next(1,Text.Length/2);
var result= Split(Text,chunk);
Console.WriteLine("Splited:");
foreach (var word in result)
{
Console.WriteLine(word);
}
string toOld = "";
Console.WriteLine("Returned:");
toOld = result.Aggregate((i, j) => i + j);
Console.WriteLine(toOld);
Console.ReadLine();
}
static List<string> Split(string str, int chunkSize)
{
var re = Enumerable.Range(0, str.Length / chunkSize)
.Select(i => str.Substring(i * chunkSize, chunkSize)).ToList() ;
var temp = re.Aggregate((i, j) => i + j);
if (temp.Length < str.Length)
{
var last = re.Last();
last += str.Substring(temp.Length, str.Length - temp.Length);
re[re.Count-1] = last;
}
return re;
}