【问题标题】:SAS: Find the seed used to generate random numbersSAS:找到用于生成随机数的种子
【发布时间】: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 亿个种子。只需尝试在目标种子几秒钟内的所有种子。

标签: random sas


【解决方案1】:

当您使用 RAND 函数时,您正在寻找由 SAS 创建的宏变量 SYSRANDOM。

28         data random;
29            *call streaminit(0);
30            do _n_ = 1 to 4;
31               x = rand('uniform');
32               output;
33               end;
34         
35            run;

NOTE: The data set WORK.RANDOM has 4 observations and 1 variables.

36         %put NOTE: &=sysrandom;
NOTE: SYSRANDOM=1065925276

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2013-08-23
    • 2017-08-29
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多