| Автор |
Съобщение |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
 Алгоритъм за сравняване на числа?
Искам да генерирам примерно 6 цифрени числа, в които всяка цифра се среща един път и не надвишава разредността на числото, в случая 6. Примерно 123456, 123465,654321 и т.н. Зле съм в комбинаториката и за по лесно решавам да ползвам няколко вградени for цикъла, които въртят всеки разряд на числото. Така ще трябва да отсявам нужните ми комбинации, което обаче опира до голям брой сравнения между всеки разряд с останалите. Предполагам че има по-елегантен начин да се получи това което искам, някакви идеи?
|
| Нед Авг 19, 2012 12:01 pm |
|
 |
|
test11
Ранг: Минаващ
Регистриран на: Съб Юли 07, 2012 2:36 pm Мнения: 5
|
 Re: Алгоритъм за сравняване на числа?
Заделяш 10 бита и ги нулираш. Правиш цикъл от едно от разредите на числото. Генерираш случайно числи 0..9 Проверяваш дали съответния бит е вдигнат, значи числото е било теглено вече. Повтаряш реда. Добавяш към реда с генерирани числа и вдигаш съотвения бит. 
|
| Нед Авг 19, 2012 12:09 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
 Re: Алгоритъм за сравняване на числа?
И накрая като остане само една възможност седиш и чакаш докато рандъм генератора ти я улучи... 
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Нед Авг 19, 2012 12:27 pm |
|
 |
|
test11
Ранг: Минаващ
Регистриран на: Съб Юли 07, 2012 2:36 pm Мнения: 5
|
 Re: Алгоритъм за сравняване на числа?
Вероятност 1:10. Едва ли ще чакаш повече от 10мс 
|
| Нед Авг 19, 2012 12:31 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 Re: Алгоритъм за сравняване на числа?
Ммммммм не мисля че е точно 1:10, ако рандъм генератора е наистина случаен, зависи от типа му, но може и да е 1:50 ... ако не е съвсем случаен току виж е 1:100, ти виждал ли си рандом генератор който от 10 запитвания връща 10 различни стойности .. то тогава ниакак няма да е рандъм, почвам да мечтая за покер или слот машина с такъв, 1 от 10 тегления ти е гарантирана печалба ...  По скоро малко математика трябва, ама нещо не ми хрумва как точно да стане, може да се понапъна, ама със сигурност има други които ще ме преварят, напоследък комбинаториката ми се изчрва с това как прекарам 10 тръби Ф400 със по 5 колена, така че хем да не си пречат хем да са достъпни, хем и да могат да се подменят ... ако някой си мисли че рутирането на платка е зор ... верно поне че можеш да режеш и сменяш колкото искаш, само дето всичко струва $$$, та още го разигравам в солида, да е жив и здрав който го е измислил тоя софт.
|
| Нед Авг 19, 2012 6:33 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
 Re: Алгоритъм за сравняване на числа?
Всъщност последната цифра програмката трябва да я попълни сама без да чака. Сещам се за подобна задачка която правих преди време. Но там вместо рандом генератор всяко поредно число се въвежда от оператор. Софтуера на всяка последователна стъпка стеснява избора на оператора, като изключва от множеството на възможните числа вече въведените. Та моето предложение е за праволинеен подход. На всяка следваща стъпка стеснявай множеството на рандъм генератора. На първата стъпка връща от 0 до 9. На втората връща от 0 до 8 и т.н. на предпоследната от 0 до 1. Последната стъпка цифрата се попълва без да се ползва рандъм генератора. Съответно трябва да поддържаш нещо като map, чрез който да конвертираш полученото от рандъм генератора на всяка стъпка в конкретна цифра от множеството на възможните. Което множество на всяка стъпка се стеснява. Например в началото този map изглежда така: 0 - 0 1 - 1 2 - 2 3 - 3 4 - 4 5 - 5 6 - 6 7 - 7 8 - 8 9 - 9 Да речем че на първата стъпка е изтеглено числото 4. Съответно множеството от възможните за втора стъпка става {0,1,2,3,5,6,7,8,9}. Рандъм генератора трябва да ти върне за втората стъпка число в интервала 0 до 8. И съответно map-а за втората стъпка изглежда така: 0 - 0 1 - 1 2 - 2 3 - 3 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 Ако на втората стъпка бъде изтеглено числото 6. Според map-а това съответства на числото 7. И така докато размера на map-а стане равен на единица и съдържа последното число, което взимаме направо. ПС: Ако съм разбрал правилно задачата де 
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Нед Авг 19, 2012 7:22 pm |
|
 |
|
БатеВаньо
Ранг: Новодошъл
Регистриран на: Чет Яну 04, 2007 12:43 am Мнения: 178
|
 Re: Алгоритъм за сравняване на числа?
Класическият начин да се направи това е с разместване. В условието на задачата не е дефинирано дали трябва да се изгенерират всички пермутации от 6 елемента или случайна пермутация, но всяка една от тях може да се получи от изходното число с (n-1) размествания. Например: - тръгва се от начална стойност 123456 (може и като стринг "123456"); - генерира се число (по случаен закон или с цикъл) от 0 до 5 и първата цифра се разменя с цифрата от тази позиция (естествено, при 0 не се прави размяна); - на следващата стъпка се генерира число от 1 до 5 и втората цифра се разменя с посочената позиция и т.н. Ако трябва да се генерират всички пермутации, на практика това става с пет вложени цикъла.
|
| Нед Авг 19, 2012 9:14 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Алгоритъм за сравняване на числа?
Най добре е да си ги изгенерира. Не са толкова много числата за съвременен компютър и със сигурност няма да му се повтарят.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Нед Авг 19, 2012 9:53 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
 Re: Алгоритъм за сравняване на числа?
Трябват ми всички пермутации. Без значение дали са в някакъв подреден или случаен ред и начална стойност. Наистина комбинациите са малко и могат да се изгенерират всякак. Исках да разбера дали има по универсален подход, защото разредността може да е различна от посочената, като примерна. БатеВаньо, идеята с преместването е интересна, ще се опитам да вникна в нея 
|
| Нед Авг 19, 2012 10:21 pm |
|
 |
|
БатеВаньо
Ранг: Новодошъл
Регистриран на: Чет Яну 04, 2007 12:43 am Мнения: 178
|
 Re: Алгоритъм за сравняване на числа?
Ако се генерират всички пермутации, тогава алгоритъмът може да се генерализира, така че броят на цифрите да не е твърдо кодиран в структурата на програмата. Ясно е, че броят на всички пермутации от n елемента е n!. Тогава може да се завърти цикъл от 0 до (n! - 1) и за всяка стойност на променливата да се изгенерира съответната пермутация. А генерирането може да стане като за всяка стойност на този (да го наречем) индекс първо се намери частното и остатъкът от делението му на 2. Остатъкът (+ n - 2) се използва като индекс за разместване на n-2-рата цифра. Частното от предишната операция се използва като се дели на 3 и пак се намира частно и остатък (напр. чрез стандартната функция div() ). Остатъкът отново се използва за разместване, а частното се използва по-нататък... Така разместването се прави в обратен ред, но пак се получават всички пермутации.
|
| Нед Авг 19, 2012 10:43 pm |
|
 |
|
Reader
Ранг: Новодошъл
Регистриран на: Нед Апр 17, 2005 9:23 am Мнения: 112
|
 Re: Алгоритъм за сравняване на числа?
Има алгоритъм (мисля, че с почти линейна сложност), който осигурява съответствие между пермутациите от даден ред и естествените числа. Т.е. ти му подаваш 1, 2, 3… а той ти връща 123456, 123465,… Ако го изнамериш, достатъчно е само да извъртиш един цикъл по броя пермутации и да ги подадеш на функцията за съответствие.
|
| Пон Авг 20, 2012 12:01 pm |
|
 |
|
dan
Ранг: Форумен бог
Регистриран на: Вто Май 29, 2007 2:23 pm Мнения: 3714 Местоположение: Високо в планината
|
 Re: Алгоритъм за сравняване на числа?
Един програмист отишъл при свой колега и го попитай: -Извинявай, имаш ли генератор на случайни числа? Колегата му отговорил: -12.
_________________ Хайде де!
|
| Пон Авг 20, 2012 2:04 pm |
|
|