【发布时间】:2017-03-10 21:41:50
【问题描述】:
是否有可能找到用于生成一组随机数的种子 SAS?
例如,如果我运行
data random;
do i = 1 to 10;
x = rand('uniform');
output;
end;
drop i;
run;
SAS 生成我喜欢的值序列,我能找到生成该特定值序列的种子吗?
将种子用于特定运行可能很有用,例如,在抖动数据时。当我需要为绘图抖动数据时,我必须手动尝试不同的种子来找到没有(太多)重叠的种子。让 SAS 选择种子会更简单,运行抖动直到情节看起来不错,然后将种子设置为 SAS 碰巧选择的任何值。
【问题讨论】:
-
你从什么信息开始?只是数据?多少呢?样本中可用的位数是大于还是小于种子中的位数?如果您只是部分恢复了种子怎么办?这足以满足您的目的吗?默认使用系统时间;你知道种子产生的大概时间吗?
-
我从问题中给出的信息开始:用于生成一些随机数的代码、执行代码的会话以及生成的随机数。假设您对系统时间的看法是正确的,那么问题可以改写为“我如何找到用于播种上次提交时生成的随机数的系统时间?”
-
你知道种子中有多少有效熵吗?如果它是 32 或更小,那么这个问题很容易解决。如果它很大,比如 64 位或更高,那么你遇到的问题要困难得多。
-
简而言之:假设种子中有 32 位熵。编写一个程序,生成所有 40 亿个种子,并给你第一个,比如说,一千个元素。现在从生成的数字到产生它的种子制作一张地图。把整个东西放在一个数据库里,现在你可以很容易地解决你的问题。生成 4 万亿个数字并将它们放入数据库中不会超过几个小时,而且您可以轻松地将其并行到多台机器上。
-
如果您知道生成种子的可能时间,那么您当然不必尝试所有 40 亿个种子。只需尝试在目标种子几秒钟内的所有种子。