字符洗牌

3 .net c# asp.net shuffle char

我只是想知道是否有一种方法(使用ASP.NET C#)"乱码"字符串的内容,但仍然能够点击另一个按钮并"将其"重新混合"回原始内容而不保存原始内容?

谢谢 :)

例:

"This is not shuffled."

"isuo .tffsnl iTh shed"

...And then I click the "UNShuffle" button and it becomes normal again:

"This is not shuffled."
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 8

足够简单:

var rnd = new Random();
string unsuffled = "This is not shuffled.";
string shuffled = new string(unsuffled.OrderBy(r => rnd.Next()).ToArray());
Run Code Online (Sandbox Code Playgroud)

但是因为它是随机的,除非你存储前一个字符串或映射,否则你不能解开.

  • 不,您必须存储用于制作随机种子的种子(并使用它制作新实例)或存储从随机实例中获得的随机值.即使这样,我也想不出你会怎么知道原来的订单. (2认同)

Jon*_*eet 6

好吧,你需要保存一些东西.一个简单的想法:

  • 使用随机数生成器生成随机种子.
  • 创建一个Random用于使用该种子进行混洗的新实例
  • 随着修改过的Fisher-Yates shuffle洗牌
  • 保持种子

然后洗牌是可逆的 - 诚然需要付出一点努力.(我可能会以相同的方式将数字0 ...(n-1)洗牌,然后以相反的方式反向映射字符.)

棘手的一点是你确实需要种子 - 它有点像存储密码哈希中的盐.你必须得到一些额外的信息来说明它是如何改组的,否则你不会知道"abc"是来自"bac"还是"cab".