我正在开发游戏(Unity),我需要根据多个float
和/或int
创建一个随机浮动值(介于0和1之间)。
我认为为该函数手动创建单个字符串会更容易,但也许它可以接受float
和/或"[5-91]-52-1"
的列表。
结果示例:
0.158756..
> {{1}} 要点:
奖励积分:
答案 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的情况下到达那里将很困难。种子的任何变化都可能而且应该导致所得序列的很多变化。