как бы это сделать правильно ... вот на примере алфавита: Код (Text): ;========================================================================; data objects db 'abcdefghijklmnopqrstuvwxyz' objects$ = $-objects freq db 7,1,2,1,1,1,1,1,4,9,4,2,1,3,1,1,1,1,2,1,1,1,1,1,1,1 ;========================================================================; code stdcall random,objects$ ; генерация числа от 0 до 25 ... movzx eax,byte[objects+eax] ;============================================================================== необходимо генерировать случайное число (по кол-ву объектов), но так, чтобы числа выпадали в соответствии с заданой частотой, т.е. буква "a" выпадала в 7 раз чаще буквы "b" здесь это можно сделать просто изменив objects на db 'aaaaaaabccd.....', но в реальности размер objects измеряется мегабайтами и frequency одних объектов может отличаться от других в тысячи раз
Давно делал так (в аттаче исходник с генерацией распределения): Делил отрезок [0,1] на части, пропорциональные требуемой частоте и получал случайное число из [0,1], соответственно искал номер отрезка - он и был требуемым числом: Пусть требуется получать событие A с частотой (вероятностью выпадения) вдвое меньше события B. Делим отрезок [0,1] на [0,0.333..] и (0,333...,1.00] Если число из [0,1] выпало на первый интервал...
Можешь сделать примерно так: Код (Text): byte ver[26] = {7/*A=7%*/, 1/*B=1%/, ...} z = 0 for (i = 0; i<26; i++) z += ver[i] x = random(0..z) z = 0 for (i=0; i<26; i++) { z+=ver[i] if (z>ver[i]) return 'a'+i-1 } Chingachguk опередил
я думал так, т.е. сделать freq на пропорциональные отрезки freq db 7,8,10,11,12,13,14,15,19,28,32,34,35,38,39,40,41,42,44,45,46,47,48,49,50,51 затем stdcall random,51 и обходить весь freq в поисках выпавшего числа для взятия индекса? freq хранится в той же базе как свойство каждого из object, перечитывать всю базу накладно, разве только выносить freq в отдельную (хотя тоже перебирать сотни тысяч freq'ов долго)
bogrus Количество элементов массива в самом минимальном случае (моем неотлаженном) будет равно числу элементов, для которых заданы вероятности их появления
Folk Acid Ага Возможно, если надо сделать идеальна, то надо оптимизировать поиск (методом деления пополам или типа того).