CNWTEPRG 发表于 2023-12-9 10:50:26

易语言实现取指定最小值到最大值范围的随机32位单精度小数值 支持取负数 (返回小数型)


.版本 2
.支持库 spec

.程序集 程序集1

.子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码

置随机数种子 ()

_临时子程序 ()' 在初始化代码执行完毕后调用测试代码
返回 (0)' 可以根据您的需要返回任意数值

.子程序 _临时子程序
.局部变量 随机小数, 小数型

.计次循环首 (100, )
    随机小数 = 取随机小数 (0, 1)' 大于0小于1的小数
    调试输出 (随机小数)
.计次循环尾 ()

.子程序 取随机小数, 小数型, 公开, 取一个范围:最小值~最大值的小数,成功返回小数,失败返回NAN
.参数 最小值, 小数型, , 欲取随机数的最小值 (支持负数)
.参数 最大值, 小数型, , 欲取随机数的最大值 (最小值大于最大值则交换)
.局部变量 小数, 小数型
.局部变量 最小值_整, 整数型
.局部变量 最小值_指数位, 字节型, , , 范围:0~255
.局部变量 最小值_尾数位, 整数型, , , 0~8388607
.局部变量 最大值_整, 整数型
.局部变量 最大值_指数位, 字节型
.局部变量 最大值_尾数位, 整数型
.局部变量 随机指数, 字节型
.局部变量 随机尾数, 整数型
.局部变量 偏移, 小数型
.局部变量 倍数, 小数型, , , 大于1的值
.局部变量 间距, 字节型
.局部变量 连续, 字节型

.判断开始 (最小值 = 最大值)
    返回 (最大值)
.判断 (最小值 > 最大值)
    交换变量 (最小值, 最大值)
.默认

.判断结束
.循环判断首 ()
    倍数 = 取随机数 (1, ) ÷ 取随机数 (1, )
.循环判断尾 (倍数 ≤ 1)
.如果 (最小值 < 0)
    偏移 = 最小值
.否则
    偏移 = 0
.如果结束
最小值 = (最小值 - 偏移) ÷ 倍数
最大值 = (最大值 - 偏移) ÷ 倍数
最小值_整 = 小数_联合到整数 (最小值)
最大值_整 = 小数_联合到整数 (最大值)
.如果真 (是否运算正确 (最小值) = 假 或 是否运算正确 (最大值) = 假)
    返回 (整数_联合到小数 (2147483647))
.如果真结束
最小值_指数位 = 右移 (最小值_整, 23)
最大值_指数位 = 右移 (最大值_整, 23)
最小值_尾数位 = 位与 (最小值_整, 8388607)
最大值_尾数位 = 位与 (最大值_整, 8388607)
.循环判断首 ()
    随机尾数 = 位与 (位异或 (左移 (取随机数 (, ), 7), 取随机数 (, )), 8388607)
    间距 = 最大值_指数位 - 最小值_指数位
    .如果 (间距 ≠ 0)
      .计次循环首 (间距, )
            .如果 (取随机数 (0, 255) ≥ 128)
                连续 = 连续 + 1
            .否则
                跳出循环 ()
            .如果结束

      .计次循环尾 ()
      随机指数 = 最小值_指数位 + 间距 - 连续
      .判断开始 (随机指数 = 最小值_指数位)
            随机尾数 = 限制整数范围 (随机尾数, 最小值_尾数位, 8388607)
      .判断 (随机指数 = 最大值_指数位)
            随机尾数 = 限制整数范围 (随机尾数, 0, 最大值_尾数位)
      .默认

      .判断结束

    .否则
      随机指数 = 最小值_指数位
      随机尾数 = 限制整数范围 (随机尾数, 最小值_尾数位, 最大值_尾数位)
    .如果结束
    小数 = 整数_联合到小数 (位或 (左移 (随机指数, 23), 随机尾数))
.循环判断尾 (小数 < 最小值 或 小数 > 最大值)
返回 (小数 × 倍数 + 偏移)

.子程序 整数_联合到小数, 小数型
.参数 整数, 整数型

置入代码 ({ 139, 69, 8, 201, 194, 4, 0 })
' mov eax,
' leave
' retn 4
返回 (0)

.子程序 小数_联合到整数, 整数型
.参数 小数, 小数型

置入代码 ({ 139, 69, 8, 201, 194, 4, 0 })
' mov eax,
' leave
' retn 4
返回 (0)

.子程序 限制整数范围, 整数型
.参数 数值, 整数型
.参数 最大值, 整数型
.参数 最小值, 整数型

.如果真 (最大值 < 最小值)
    交换变量 (最大值, 最小值)
.如果真结束
返回 (数值 % (最大值 - 最小值 + 1) + 最小值)
页: [1]
查看完整版本: 易语言实现取指定最小值到最大值范围的随机32位单精度小数值 支持取负数 (返回小数型)