Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2010, 03:18   #1
Аlex
Форумчанин
 
Регистрация: 16.11.2006
Сообщений: 175
По умолчанию как задать диапазон для случайных чисел

Здравствуйте помогите пжл , а то я уже запарился, да и время поджимает
собсно есть программа которпая считает случайные числа по следующей формуле: X(n+1)=(a*X(n)+c)mod m, X0 берет из системного таймера, сабж в том как сделать так чтобы выдаваемые случайные числа лежали в нужном диапазоне вопрос не столько в программной реализации а сколько в алгоритике (числа то случайные как они могут быть зависимы о границ интервала? О_о ) вообсчем моя программа вот
Код:
	.model small
.486
.stack 200h
.data
    c       dd  1013904223
    a       dd  1664525	
	N		dd   20 ; количество циклов 
	M		dd 	24; модуль (степень двойки, не больше 31)
	arr 	dd 1000 Dup(0) ; создаем  массив 
	i 		db	0	; счетчик элементов  массива 
    
	seed    dd  ?
	Buff dd 10, 6 dup(0), '$'
	fl db 0
    text     db  'Initial random seed:', 13, 10, '$'
	text_A   db  'A = $'
	text_C   db  'C = $'
	text_M   db  'M = $'
	text_N   db  'N = $'
	text_err db 13, 10, 'Maybe  END or error, please press any key to Quite', 13, 10, '$'
	wringMSG db	'Wrong input, please reinput', 13, 10, '$'
	ask_A	 db	'    X(n+1) = (a*X(n)+ c) mod m ',13,10,'input a',13,10,'$'
	ask_C	 db	13,10,'input c',13,10,'$'
	ask_M	 db	13,10,'input m (0..24)',13,10,'$'
	ask_N	 db	13,10,'Enter the number of output sequences',13,10,'$' ; количество выводимых результатов 
.code
start:
    mov     ax, @data
    mov     ds, ax
	;*-*-*-*-*-*-*-*-*готовим экран*-*-*-*-*-
	MOV AX,0600H ;AH 06 (прокрутка) ;AL 00 (весь экран)
MOV BH,07 ;Нормальный атрибут (черно/белый)
MOV CX,0000 ;Верхняя левая позиция
MOV DX,184FH ;Нижняя правая позиция
INT 10H ;Передача управления в BIOS
	
 ; диалог с пользователем не влазиет по длинне :-(
;**********************************************************************	
	; цыкл N раз 
	xor eax,eax ; очистим аккомулятор 
	call Randomize ; разогреть генератор
	xor 	esi,esi ; загрузить адрес начала массива в esi 
main_loop:
    push    cx
    call    Random
	mov 	CL,  byte ptr M
    shr     eax, CL ; разделить на 2^M=16777216
	mov 	arr[esi*4],eax ; масштабируем индекс массива в соответствии с размером элемента и пхаем в него текущее значение
    call    Print
	inc 	esi ; увеличиваем индекс массива 
    pop     cx
    dec     n
	add		i,5
	cmp		n,0
    jg     main_loop ;если N=0
	call	Error_Exit; ждем нажатие клавиши для выхода 
    mov     ax, 4c00h
    int     21h
;----------------------------------------------------------------------------------------------------------
; 
;
;процедура input не влезла на сайт по длинне :-(
;пришлось ее удалить

;----------------------------------------------------------------------------------------------------------
Randomize proc
    mov     ah, 2ch
    int     21h  ;Теперь CH содержит часы (от 0 до 24)
				 ;CL - минуты (от 0 до 59)
				 ;DH - секунды (от 0 до 59)
				 ;DL - сотые доли секунды (от 0 до 99)
    mov     ax, dx
    shl     eax, 16
    mov     ax, cx
    mov     seed, eax
    ret
Randomize endp
;----------------------------------------------------------------------------------------------------------
Random proc
    xor     edx, edx
    mov     eax, seed
    mul     a
    add     eax, c
    mov     seed, eax
    ret
Random endp
;----------------------------------------------------------------------------------------------------------
;процедура print не влезла на сайт по длинне :-(
;----------------------------------------------------------------------------------------------------------
Error_Exit proc		; сообщаем, что все пропало и выходим
mov DX, offset text_err
mov AH, 9
int 21h
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
ret
Error_Exit endp
end start
ну еще погуглив нашел вроде бы процедурку где можно указать границу интервала но не могу никак ее прикрутить к моей программе

;----------------------------------------------------------------------------------------------------------

кароче вся программа сюда не лезет выклал ее здесь
чайник юзеру не товарищ, а сам себе враг...

Последний раз редактировалось Аlex; 07.05.2010 в 03:21.
Аlex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор случайных чисел для массива! Tetramorf Общие вопросы C/C++ 8 11.03.2010 13:51
Метод шифрования\дешифрования методом гаммирования, используя для гаммы алгоритм случайных чисел... Си. Mastu-Basta Помощь студентам 0 13.09.2009 16:19
задать диапазон используя значение переменной eto Microsoft Office Excel 12 03.03.2009 17:36
Как написать в коде чтобы диапазон А копировался как значение в диапазон В. Dorvir Microsoft Office Excel 12 23.05.2008 22:11
Как указать диапазон чисел? Inbox Общие вопросы Delphi 2 29.06.2007 01:21