【问题标题】:Shuffle characters of a string based on a key基于键随机播放字符串的字符
【发布时间】:2014-09-21 14:05:51
【问题描述】:

我有以下字符串:

String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

我需要从中创建两个字符串:

  1. 简单地对字符重新排序得到的字符串;

  2. 选择10个字符并重新排序得到的字符串。

所以对于(1)我会得到,例如:

String characters = "jkDEF56789hisGHIbdefpqraXYZ1234txyzABCcglmnoRSTUVWuvwJKLMNOPQ0";

对于 (2) 我会得到,例如:

String shortList = "8GisIbH9hd";

问题

我可以改为 Char Array 并通过 Guid 随机排序。

但是我想指定某种键(可能是 guid?),对于该键,结果或重新排序以及选择 shortList 的结果必须相同。

这有意义吗?

【问题讨论】:

  • 您的问题不清楚。如何“基于 Guid”“重新排序”第一个字符串。我想你选错词了。你能一步一步解释你真正想要什么,你现在有什么问题吗?
  • (1) 和 (2) 的确切输出是什么?
  • 您是否希望在 Guid 中对 (1)62 和 (2)10 个字符的任意重新排序进行编码?您有 62 个唯一字符,因此每个字符都可以用一个 6 位数字表示。因此,10 个字符的任意重新排序需要不超过 60 位,因此可以在 Guid(128 位)中编码。然而,对所有 62 个字符进行任意重新排序需要超过 128 位,因此您的 Guid 需要索引到一个表中。
  • 抱歉,耽搁了。我刚刚更新了我的答案。基本上我想重新排序一个字符串字符并选择该字符串的一部分也重新排序,但根据一个键结果总是相同的......所以如果我使用作为键“ksjdhkjhurer”那么结果只会改变如果我改变那个键。

标签: c#


【解决方案1】:

您可以将您的 GUID 字符串转换为其 ascii/utf/whatever 代码的 int 数组,如此处 Getting The ASCII Value of a character in a C# string。 然后用沿着这条线的东西迭代这个数组(注意:这是伪代码):

 string res="";
 for(elem in intconvertedGUIDstring) res+= characters[elem%(characters.count)];

对于任务 [2],您可以反转您的角色,即像这里 Best way to reverse a string 并使用 c# 字符串函数 left() 将其截断,然后再通过相同的过程运行它

【讨论】:

    【解决方案2】:

    您可以使用具有良好分布值的哈希函数作为元素之间比较的种子。这是一个示例:

    static ulong GetHash(char value, ulong seed)
    {
       ulong hash = seed * 3074457345618258791ul;
       hash += value;
       hash *= 3074457345618258799ul;
       return hash;
    }
    

    并使用此功能进行比较:

    static void Main()
    {
       var seed = 53ul;
       var str = "ABCDEFHYUXASPOIMNJH";
       var shuffledStr = new string(str.OrderBy(x => GetHash(x, seed)).ToArray());
       Console.WriteLine(shuffledStr);
    }
    

    现在,每次您按种子 53 订购时,您都会得到相同的结果,如果您按 54 种子订购,您会得到不同的结果。

    【讨论】:

      猜你喜欢
      • 2016-04-28
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      相关资源
      最近更新 更多