基于多个数据创建相同的“随机”浮点数

时间:2017-12-29 16:56:53

标签: c# unity3d random hash

我正在开发游戏(Unity),我需要根据多个float和/或int创建一个随机浮动值(介于0和1之间)。

我认为为该函数手动创建单个字符串会更容易,但也许它可以接受float和/或"[5-91]-52-1"的列表。

结果示例:

  • 0.158756..> {{1}}

要点:

  • 结果的分布(介于0和1之间)必须等于(不希望90%的结果介于0.45和0.55之间)
  • 要求相同字符串的2次必须返回完全相同的结果(即使我重新加载应用,或在不同的计算机上启动它,..)
  • 结果无需独特。

奖励积分:

  • 有时我需要关闭相似的字符串返回关闭结果,但不是每次。 “随机生成”可以使用此功能处理布尔值吗?

2 个答案:

答案 0 :(得分:4)

您所描述的实质上是哈希函数的定义。

所以只需使用一个并将结果标准化到您想要的范围内。最基本的情况可以使用<div class="from-group"> <div class="checkbox-group" v-model="permissionsSelected"> @foreach ($permissions as $permission) <div class="field"> <input type="checkbox" value="{{$permission->id}}" name="permissions[]">{{$permission->display_name}} </div> @endforeach </div>,但不保证在不同版本的框架中产生相同的结果。

保证在机器上提供完全相同结果的稳定版本将使用众所周知的良好散列 - 如加密散列SHA256并将结果的几个第一个字节作为整数和规范化。加密散列函数也可以方便地将字节数组作为输入,因此您可以将多个值直接组合为字节并获得稳定的结果。

GetHashCode

要将多个值组合到字节数组中,您可以手动合并 var intValue = 42; var bytesToHash = BitConverter.GetBytes(intValue); var hash = System.Security.Cryptography.SHA256Managed.Create() .ComputeHash(bytesToHash); var toNormalize = BitConverter.ToUInt32(hash,0); var fancyRandom = (double)toNormalize/UInt32.MaxValue; 的结果或BitConverter.GetBytes上使用BinaryWriter

或者,你可以使用结果整数作为种子,用于伪随机生成器的某些自定义实现(因为.Net中的一个不保证在评论中建议的跨机器/版本的.Net提供相同的结果),但我不是&# 39;认为它会给出明显更好的分配。

注意:确保产生的数字分布足够随机并且#34;为你的情况。加密散列函数可能会给你想要的结果,但我不知道如何证明这一点。

对于&#34;奖金&#34; part:如果你能找到能够始终如一地产生接近结果的伪随机发生器,我将会非常惊讶,类似于#34;种子。相反,你可以使用与上面相同的方法来处理单独的部分 - 一个&#34;相同的&#34;处理变异的其他因素(即MemoryStream表示稳定部分,intValue & 0xFFFFFF00表示&#34;小差异&#34;)而不是合并结果&#34;随机&#34;有一些权重的数字:intValue & 0xFF

答案 1 :(得分:3)

我建议使用哈希码(或类似的东西)作为is_a?对象的种子。对于相同的字符串,Hashcodes必须相同,因此您将始终获得相同的序列。

正如Nuf指出的那样,只有相同的app-domain才能保证哈希码相同;所以它可能无法重启。

关于你的奖励积分,在没有编写自己的RNG的情况下到达那里将很困难。种子的任何变化都可能而且应该导致所得序列的很多变化。