Помогите составить алгоритм...

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Помогите составить алгоритм...

Сообщение areh » 21.06.2004 (Пн) 17:50

Всем привет,

возникла у меня тут необходимость составления некоторого алгоритма, вот я и решил попросить у вас помощи. Буду рад как советам, так и вариантам реализации :)

Итак, пусть это будет некоторая функция, получающая в качестве параметров несколько чисел (не менее 3), и возвращающая значение в диапазоне от 1 до 1048576 (2^20), в работе функции не должен использоваться генератор случ. чисел, т.е. результат функции от одних и тех же параметров должен быть всегда один и тот же. Необходимо, чтобы распределение значений было достаточно равномерным, а так же, чтобы функция могла принимать все значения этого диапазона.

Вообще говоря, можно немного изменить условия, главное чтобы суть была примерно такой :)

Если вдруг эта задача имеет какое-то определенное название (я предполагаю, что она встречаеться довольно часто) подскажите как она завёться, просто трудно искать в Internet'е что-то, низная что ищешь...

Буду рад любой помощи!

Гость
 

Сообщение Гость » 21.06.2004 (Пн) 22:20

Коряво правда, но может даст путь дальнейшим усовершенствованиям.

Private Function Rand(a As Integer, b As Integer, c As Integer)
e = a + b + c
e = e * 1048576
While e > 1048576
e = e - 1000000
Wend
Rand = e
End Function

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.06.2004 (Вт) 4:19

Гы-гы-гы :)
Эта задача действительно имеет название, только я его не помню. По сути тебе нужно воспроизвести генератор псевдослучайных чисел, он ведь именно так работает. Поищи это сочетание в гугле. Какой-то учёный... не помню кто :) вывел формулу, которая принимает, кажется, как раз 3 параметра (а может и 4, не помню). При этом результаты, даваемые этой формулой, сильно похожи на реальные ряды случайных чисел.

ЗЫ: На самом деле, rnd работает по этой формуле :)
Последний раз редактировалось GSerg 22.06.2004 (Вт) 9:46, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Сообщение areh » 22.06.2004 (Вт) 9:24

Пасиба GSerg...

вообщем нашел я вот такой алгоритм, но что-то как-то плохо у меня с С... если кого не затруднит, помогите перевести на VB.NET итак
Код: Выделить всё
static struct
{
    unsigned Head, Tail;
    unsigned Pool[64];
} LyRandom;

void LyRandomPushSalt(unsigned Salt)
{
    LyRandom.Pool[LyRandom.Head++] += Salt;
}

unsigned LyRandomGet()
{
    unsigned Value =
        LyRandom.Pool[LyRandom.Tail]         // X1
        ^ LyRandom.Pool[LyRandom.Tail +  1]  // X64
        ^ LyRandom.Pool[LyRandom.Tail + 62]  // X4
        ^ LyRandom.Pool[LyRandom.Tail + 61]; // X3

    unsigned Salt =
        1 // может быть любое ненулевое значение
        + LyRandom.Pool[LyRandom.Tail + 11] <<< 5
        + LyRandom.Pool[LyRandom.Tail + 23] <<< 7
        + LyRandom.Pool[LyRandom.Tail + 37] <<< 1;

    Value += Salt; Value += Value < Salt; // циклическое сложение с переносом
    LyRandom.Pool[++LyRandom.Tail] = Value;
    return Value;
}

void LyRandomInit(unsigned Seed)
{
    LyRandom.Tail = LyRandom.Head = 0;
    LyRandomPushSalt(Seed);
    for(unsigned i = 0; i < 4096; i++)
        LyRandomGet();
}


заранее пасибо...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.06.2004 (Вт) 9:57

Чё-то не то ты нашёл :)
Там всего одна формула должна быть. Ну ладно. Тэкс...

Э, а чего такое "<<<"?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.06.2004 (Вт) 10:20

Да нет такого оператора вообще...
Посмотри директивы #define, что там определено как <<< :?:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.06.2004 (Вт) 10:44

Код: Выделить всё
Option Explicit

Private Type LyRandomStruct
  Head As Long
  Tail As Long
  Pool(0 To 63) As Long
End Type

Private LyRandom As LyRandomStruct

Private Sub LyRandomPushSalt(ByVal Salt As Long)
  LyRandom.Pool(LyRandom.Head) = LyRandom.Pool(LyRandom.Head) + Salt
  LyRandom.Head = LyRandom.Head + 1
End Sub

Private Function LyRandomGet() As Long
  Dim Salt As Long
 
  LyRandomGet = LyRandom.Pool(LyRandom.Tail) Xor LyRandom.Pool(LyRandom.Tail + 1) Xor LyRandom.Pool(LyRandom.Tail + 62) Xor LyRandom.Pool(LyRandom.Tail + 61)
  'Salt = 1 + LyRandom.Pool(LyRandom.Tail + 11) + LyRandom.Pool(LyRandom.Tail + 23) + LyRandom.Pool(LyRandom.Tail + 37)
'unsigned Salt =
'       1 // может быть любое ненулевое значение
'       + LyRandom.Pool[LyRandom.Tail + 11] <<< 5
'       + LyRandom.Pool[LyRandom.Tail + 23] <<< 7
'       + LyRandom.Pool[LyRandom.Tail + 37] <<< 1;

  LyRandomGet = LyRandomGet + Salt
  LyRandomGet = LyRandomGet + IIf(LyRandomGet < Salt, 1, 0)
 
  LyRandom.Tail = LyRandom.Tail + 1
  LyRandom.Pool(LyRandom.Tail) = LyRandomGet
End Function

Private Sub LyRandomInit(ByVal Seed As Long)
  Dim i As Long
 
  LyRandom.Tail = 0
  LyRandom.Head = 0
  LyRandomPushSalt Seed
 
  For i = 0 To 4095
    LyRandomGet
  Next
End Sub


Всё, кроме <<<
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Где-то так...

Сообщение Faust » 23.06.2004 (Ср) 21:29

Может быть, это поможет.
Приду домой, подумаю над этой проблемой побольше...
Листинги не горят!

areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Сообщение areh » 25.06.2004 (Пт) 0:32

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

Faust сенкс за ссылку, счас посмотрю, подумаю...


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 144

    TopList