/// <summary> /// 随机打乱字符串中的所有字符 /// </summary> /// <param name="str">需要被打乱的字符串</param> /// <param name="seed">种子</param> /// <returns>被打乱的字符串</returns> public static string Shuffle(string str, int?seed = null) { KGuard.Requires <ArgumentNullException>(str != null); var random = KUtil.MakeRandom(seed); var requested = new string[str.Length]; for (var i = 0; i < str.Length; i++) { var index = random.Next(0, str.Length - 1); requested[i] = requested[i] ?? str.Substring(i, 1); requested[index] = requested[index] ?? str.Substring(index, 1); if (index == i) { continue; } var temp = requested[i]; requested[i] = requested[index]; requested[index] = temp; } return(KArray.Reduce(requested, (v1, v2) => v1 + v2, string.Empty)); }
/// <summary> /// 生成一个随机字母(含大小写),数字的字符串。 /// </summary> /// <param name="length">字符串长度</param> /// <param name="seed">种子</param> /// <returns>随机的字符串</returns> public static string Random(int length = 16, int?seed = null) { KGuard.Requires <ArgumentOutOfRangeException>(length > 0); var requested = string.Empty; var random = KUtil.MakeRandom(seed); for (int len; (len = requested.Length) < length;) { var size = length - len; var bytes = new byte[size]; random.NextBytes(bytes); var code = Replace(new[] { "/", "+", "=" }, string.Empty, Convert.ToBase64String(bytes)); requested += code.Substring(0, Math.Min(size, code.Length)); } return(requested); }
/// <summary> /// 将规定数组中的元素打乱 /// </summary> /// <typeparam name="T">数组类型</typeparam> /// <param name="source">规定数组</param> /// <param name="seed">种子</param> /// <returns>打乱后的数组</returns> public static T[] Shuffle <T>(T[] source, int?seed = null) { KGuard.Requires <ArgumentNullException>(source != null); var requested = new T[source.Length]; Array.Copy(source, requested, source.Length); var random = KUtil.MakeRandom(seed); for (var i = 0; i < requested.Length; i++) { var index = random.Next(0, requested.Length - 1); if (index == i) { continue; } var temp = requested[i]; requested[i] = requested[index]; requested[index] = temp; } return(requested); }