2015-05-24 2 views
-1

я нашел this possible solution , но это дает мне что-то вроде:Генерация случайного числа на MIPS

598756802 
373297426 
-2011171535 

Это походит на его печать скорее Адресная значение числа. Как это исправить?

Также мне нужно установить диапазон для генератора. Как генерировать случайное число от 0 до 99.
Как я мог это сделать?
Наблюдение: Уже пробовали с syscall 42 код, но у меня есть ошибка.
(OFF: По крайней мере, объясните причину нисходящего хода, у меня нет хрустального шара).

код:

.text 
    li $v0, 41   # Service 41, random int  
    syscall   # Generate random int (returns in $a0) 
    li $v0, 1   # Service 1, print int 
    syscall   # Print previously generated random int 

обновление И это всегда дает мне такое же число, 1000.

.text 
    li $a1, 2501 
    li $v0, 42 #random 
    add $a0, $a0, 1000 
    li $v0, 1 
    syscall 
+1

«не показывает никаких исследовательских усилий» (или мышления) ... здесь есть масса ресурсов, которые рассказывают вам, как получить случайное число в диапазон. Тривиальное (хотя и статистически не идеальное) решение состоит в том, чтобы просто делить на 100 и взять остаток. PS: да, цифры, которые вы напечатали **, являются ** случайными числами, не уверен, почему вы думали иначе. – Jester

+0

@Jester Я попробовал чувак, но теперь он работает, он всегда дает мне что-то вне диапазона ИЛИ всегда такое же число ... – PlayHardGoPro

+1

Для обновленного кода вы забыли вызвать «syscall»;) – Jester

ответ

1

Я мог заставить его работать со следующим кодом:

.text 
    li $a1, 100 #Here you set $a1 to the max bound. 
    li $v0, 42 #generates the random number. 
    syscall 
    #add $a0, $a0, 100 #Here you add the lowest bound 
    li $v0, 1 #1 print integer 
    syscall 
1

Ваш последний блок кода не вызывая ГСЧ системный вызов, только печать системного вызова.

Это просто, вы просто должны сделать следующее

li $v0, 42 # 42 is system call code to generate random int 
li $a1, 100 # $a1 is where you set the upper bound 
syscall  # your generated number will be at $a0 

li $v0, 1 # 1 is the system call code to show an int number 
syscall  # as I said your generated number is at $a0, so it will be printed 

Если вы хотите сохранить ваши сгенерированные числа в массиве, это один из способов сделать это:

move $s2, $s0  # copy the initial pointer to save array 

li $v0, 42   # system call to generate random int 
la $a1, 100  # where you set the upper bound 
syscall    # your generated number will be in $a0 

sb $a0, 0($s2)  # put the generated number at the position pointed by $s2 

addi $s2, $s2, 1  # increment by one the array pointer 

Поскольку нам нужен только диапазон 0-100, мы можем сохранить каждое число в одном байте вместо sw и увеличивать указатель на 4.

+0

Спасибо за помощь, Мне было любопытно, как бы вы поместили случайный int, который у вас есть, в список или массив, которые нужно использовать повторно. – hiquetj

+0

@hiquetj вы можете проверить это в моем ответе сейчас –

0

Все, что вам нужно для создания случайного числа, это верхняя граница изменения, и вы получите его в регистре $ s1. Следующий код будет генерировать случайное число в диапазоне 0..3

addi $v0, $zero, 30  # Syscall 30: System Time syscall 
syscall     # $a0 will contain the 32 LS bits of the system time 
add $t0, $zero, $a0  # Save $a0 value in $t0 

addi $v0, $zero, 40  # Syscall 40: Random seed 
add $a0, $zero, $zero # Set RNG ID to 0 
add $a1, $zero, $t0  # Set Random seed to 
syscall 

addi $v0, $zero, 42  # Syscall 42: Random int range 
add $a0, $zero, $zero # Set RNG ID to 0 
addi $a1, $zero, 4  # Set upper bound to 4 (exclusive) 
syscall     # Generate a random number and put it in $a0 
add $s1, $zero, $a0  # Copy the random number to $s1