【问题标题】:Character Shuffler字符洗牌器
【发布时间】:2010-07-12 08:28:41
【问题描述】:

我只是想知道是否有一种方法(使用 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."

【问题讨论】:

  • @j-t-s, public int Random() { return 4; },不,您不能随机打乱它们,然后在不保存任何元数据的情况下将其恢复到原始状态。但是,如果您确切知道角色是如何移动的,您可以再次将它们移回..

标签: c# .net asp.net char shuffle


【解决方案1】:

打架很容易:

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

但由于它是随机的,除非您存储前一个字符串或映射,否则您无法取消随机播放。

【讨论】:

  • 所以,如果我存储 Random();然后在我去 unshuffle 时使用对存储的随机数的引用,应该这样做,对吧? [谢谢]
  • 不,您必须存储用于随机生成的种子(并使用它创建新实例)或存储从随机实例中获得的随机值。即便如此,我也想不出你怎么会知道原来的顺序。
【解决方案2】:

嗯,你需要保存一些东西。一个简单的想法:

  • 使用随机数生成器生成随机种子。
  • 创建Random 的新实例,用于使用该种子进行洗牌
  • 使用修改后的Fisher-Yates shuffle 随机播放
  • 保留种子

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

棘手的一点是您确实需要种子——它有点像存储的密码哈希中的盐。你必须有一些额外的信息来说明它是如何被洗牌的,否则你将不知道“abc”是来自“bac”还是“cab”。

【讨论】:

  • 啊。出色的。说得通。谢谢你,@乔恩。
  • 如果洗牌只需要看起来是随机的,那么您可以从洗牌后的文本中计算出种子,而您不需要存储种子。使用类似(未)洗牌字符串的单个字符的 ASCII 值之和应该可以解决问题。
  • @j-t-s: 你可以接受相同的输入总是被“洗牌”到相同的输出吗?
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 2016-06-19
  • 2022-11-20
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多