Равномерное распределение чисел

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Равномерное распределение чисел

Сообщение Tin » 29.05.2006 (Пн) 12:47

Есть два массива на 52 значений и 35 соответственно.
Нужно равномерно распределить 35 значений в 52.

Т.е. если бы у нас были массивы 20 (х) и 10 (у), то получилась бы такая цепочка:

хх у хх у хх у хх у хх у хх у хх у хх у хх у хх у
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.05.2006 (Пн) 13:03

А в чем сложности?
52 разделить на 35? Будет около 1.49.
Lasciate ogni speranza, voi ch'entrate.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.05.2006 (Пн) 13:05

НОД(20,10) =10 , но вот НОД(52,35)=1, поэтому у тебя получается сначала весь первый массив, а потом весь второй. :lol:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.05.2006 (Пн) 13:12

alibek писал(а):А в чем сложности?
52 разделить на 35? Будет около 1.49.
Сложность в том, что довольно затруднительно в массив загнать сначала 1.49 элементов первого массива, потом один элемент второго :) Нужно либо дополнительное условие - либо в какую сторону желательно округлять, либо еще что-то. Либо вопрос должен звучать - как сделать более-менее равномерно.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 29.05.2006 (Пн) 13:22

Да - именно боле и мение равномерно.

А 1.49 - будет большая потеря если брать их чередую нужно, что бы получилось примерно так:
х у х у хх у х у х у хх у...

Как только это посчитать...
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.05.2006 (Пн) 13:29

Гы :-)
GSerg ведь здесь рассказывал про [url=http://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма]алгоритм Брезенхема[/url]?
Вот, тут то же.
Изображение

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 29.05.2006 (Пн) 13:39

Интересно... Но как его применить тут?
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.05.2006 (Пн) 13:44

Заменяешь сдвиг по y вставкой элемента y, а сдвиг по x -- вставкой элемента x.
Изображение

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.05.2006 (Пн) 13:48

Не знаю, как там Брезенхем, но тут можно примерно так - округлять в большую (меньшую) сторону. Типа так (в меньшую): нужно 1.49 - пишем один. Потом один со второго. Потом нужно уже 1.49*2=2.98. А уже распределен один. Осталось 1.98. Округляем до 1. Потом вставляем один из второго. Теперь должно быть 1.49*3= 4.47 А вставлено только два. Осталось 2.47. Округляем до 2 и всавляем два. Вот так получится более-менее равномерно. Округлять можно любыми тремя способами.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 29.05.2006 (Пн) 13:52

Всё понял. Огромное спасибо, за как всегда дельный совет.
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 29.05.2006 (Пн) 14:10

По Брезенхему делать намного проще и красивее
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.05.2006 (Пн) 14:10

tyomitch писал(а):Гы :-)
GSerg ведь здесь рассказывал про [url=http://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма]алгоритм Брезенхема[/url]?

Во! Я никак его название вспомнить не мог.
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 30.05.2006 (Вт) 10:11

Не вчитывался в Брезенхемена, думаю, там тоже должно быть все просто. Но вот ОЧЕНЬ простой код, который делает то, что нужно, единственное ограничение - всегда сначала втыкает x, потом y:

Код: Выделить всё
x = 52
y = 35

dx = y / (x + y)
dy = 1 - dx
s = 0

For i = 1 To x + y
    If s >= 0 Then
        ... выпал х ...
        s = s - dx
    Else
        ... выпал у ...
        s = s + dy
    End If
Next i

Быть... или не быть. Вот. В чём вопрос?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.05.2006 (Вт) 11:01

uhm писал(а):Но вот ОЧЕНЬ простой код, который делает то, что нужно, единственное ограничение - всегда сначала втыкает x, потом y:

Принцип такой-же (учет и накопление ошибок округления), просто реализация чуть другая.
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 30.05.2006 (Вт) 11:05

Я, почему-то, так и думал, что ничего нового не изобрету :)
Быть... или не быть. Вот. В чём вопрос?


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 37

    TopList