【问题标题】:Assembly: Generating multiple random ints with MIPS?组装:使用 MIPS 生成多个随机整数?
【发布时间】:2014-02-12 03:22:29
【问题描述】:

所以我试图弄清楚如何使用 get system time 系统调用生成一个由 10 个不同的随机整数字符组成的字符串,但输出总是产生一个相同字符的 10 位字符串(例如“mmmmmmmmmm” ) 而不是 10 位随机字符串(例如“SdgeuEOufm”)。

任何关于我做错了什么的想法将不胜感激!

    .data:
        string: .space 11
        upper: .word 0
        lower: .word 0
    .text:
        la $t0, string  
        li $t1, 0   
        la $t2, upper
        la $t3, lower
    main:
        li $v0, 30
        syscall            
        li $v0, 40
        syscall           
        li $a1, 58
        li $v0, 42
        syscall          
        addi $a0, $a0, 65     
        sb $a0, ($t0)   

        addi $t0, $t0, 1    
        addi $t1, $t1, 1    
        blt $t1, 10, main
        sb $zero, 0($t0)    

        la $a0, string
        li $v0, 4
        syscall     

【问题讨论】:

  • 我假设是 MARS 模拟器?

标签: assembly random int character mips


【解决方案1】:

让我们看看您在循环中使用的一些系统调用:

li $v0, 30
syscall            
li $v0, 40
syscall      

MARS 系统调用 30 - 时间(系统时间)(自 1970 年 1 月 1 日以来的毫秒数)
$a0 = 系统时间的低位 32 位
$a1 = 系统时间的高位 32 位系统时间。

MARS 系统调用 40 - 设置种子
$a0 = i.d.伪随机数生成器(任何 int)。
$a1 = 对应伪随机数生成器的种子。

换句话说,您使用毫秒计数的高 32 位在循环的每次迭代中为 PRNG 播种。除非您的循环迭代需要很长时间,否则每次迭代都会为您提供相同的种子,这将导致每次迭代中 PRNG 的输出相同。
我的建议是只播种一次 PRNG(在循环开始之前)并使用系统时间的低 32 位而不是高位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2014-08-22
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多