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

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

Вернуться   Форум программистов > Операционные системы > Linux (Ubuntu, Debian, Red Hat, CentOS, Mint)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2013, 13:33   #1
DS75
Пользователь
 
Аватар для DS75
 
Регистрация: 20.04.2009
Сообщений: 50
По умолчанию Bash скрипт лотереи. Как исключить возможные повторы цифр?

Здравствуйте!
Имеется код bash скрипта:
Код:
#!/bin/bash
MAXCOUNT=6
count=1

while [ "$count" -le $MAXCOUNT ]
do
  number=$(( RANDOM%35 + 1 ))
  seans[$count]=$number
     for j in ${seans[@]}
     do
       echo $j

           if ![ $j = $number ]; then
           let "count += 1"
           fi
     done
done
echo ${seans[*]}
exit 0
Код по моей задумке должен делать следующее:
1. Определять необходимое нам количество случайных цифр
2. Генерировать их.
3. Заносить в массив.
4. Перебирать уже сгенерированные цифры из массива и сравнивать их с только что сгенерированным.
5. Если они равны, то не делать ничего. А если не равны, то переходить к следующей ячейке массива и начинать генерировать случайное число для него.

То есть это генератор случайных чисел. С одним уточнением что цифры за один розыгрыш не должны повторяться.

И что-то у меня не получается. Я знаю где. Первая цифра закинутая в массив всегда равна себе. То есть seans[$count]=$number. Зацикливается. Но как сделать чтобы первый раз сравнения не было не пойму.
Подскажите пожалуйста, кто сталкивался?

п.с. Еще нужно будет делать сортировку по возрастанию. Не подскажите в какую сторону думать?

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

Последний раз редактировалось DS75; 15.10.2013 в 13:35.
DS75 вне форума Ответить с цитированием
Старый 15.10.2013, 13:43   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не, не так. Если есть заданное число чисел, которые могут выпасть (лото, колода карт и т.д.), то гораздо проще и эффективнее заполнить массив всеми возможными значениями (в вашем случае от 1 до 36), после чего перемешать (только ПРАВИЛЬНО перемешать!!) массив случайным образом.
Потом брать числа из перемешанного массива по одному.


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

Последний раз редактировалось Serge_Bliznykov; 15.10.2013 в 13:51.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2013, 13:50   #3
DS75
Пользователь
 
Аватар для DS75
 
Регистрация: 20.04.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не, не так. Если есть заданное число чисел, которые могут выпасть (лото, колода карт и т.д.), то гораздо проще и эффективнее заполнить массив всеми возможными значениями (в вашем случае от 1 до 36), после чего перемешать (только ПРАВИЛЬНО перемешать!!) массив случайным образом.
Потом брать числа из перемешанного массива по одному.
Я даже не представляю как это можно сделать. Буду признателен если скинете ссылку или побольше любой другой инфы.
DS75 вне форума Ответить с цитированием
Старый 15.10.2013, 13:56   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а вот конкретным кодом я Вам помочь не могу - я не владею языком скриптов Bash...
извините...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2013, 14:07   #5
DS75
Пользователь
 
Аватар для DS75
 
Регистрация: 20.04.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а вот конкретным кодом я Вам помочь не могу - я не владею языком скриптов Bash...
извините...
Нашел что-то подобное на Си. http://otvet.mail.ru/question/80707471
Буду туда копать.
DS75 вне форума Ответить с цитированием
Старый 15.10.2013, 14:30   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если Вам поможет код на Паскале, то можете его поиском найти на форуме (или скажите, я набросаю)...

p.s. в том коде на C, что вы дали ссылочку, для перемешивания массива используется процедура random_shuffle. если надо, то именно её код я и могу Вам набросать!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.10.2013, 16:25   #7
DS75
Пользователь
 
Аватар для DS75
 
Регистрация: 20.04.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
если Вам поможет код на Паскале, то можете его поиском найти на форуме (или скажите, я набросаю)...

p.s. в том коде на C, что вы дали ссылочку, для перемешивания массива используется процедура random_shuffle. если надо, то именно её код я и могу Вам набросать!
Разочарован. Два часа пересаживался на этот Си консольный. А в итоге он одни и те же цифры пишет.



Вот тут прочитал что случайные набор чисел получить не http://hashcode.ru/questions/22796/c...random_shuffle получится.

Если вам не сложно помогите с кодом random_shuffle.
Изображения
Тип файла: jpg 2013-10-15_180736.jpg (30.3 Кб, 154 просмотров)
DS75 вне форума Ответить с цитированием
Старый 16.10.2013, 10:52   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, любой генератор псевдослучайных чисел нужно перед использованием иницилизировать. (судя по скриншоту ваша ошибка именно в том, что генератор НЕ ИНИЦИЛИЗИРОВАН!)
Насколько я могу судить, ГСПЧ в Bash не является исключением:
Why is Bash’s $RANDOM not seeded (?) on some machines?

во-вторых, вижу на скриншоте loto.exe
Вы этот exe-шник на Bash написали?
Какова ваша конечная цель - получить консольную программку (exe)?!

в-третьих,
Цитата:
Вот тут прочитал что случайные набор чисел получить не получится.
при чём здесь несчастный random_shuffle?! Его задача всего навсего ПЕРЕМЕШАТЬ массив. Пседвослучайным образом.

А по сути, да, СЛУЧАЙНЫХ чисел генераторы ПСЕВДО-случайных чисел не дают. Ну и что? Вы думаете, что это мешает ВСЕМ играм на компьютерах использовать ПСЕВДОСЛУЧАЙНЫЕ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2015, 11:51   #9
DS75
Пользователь
 
Аватар для DS75
 
Регистрация: 20.04.2009
Сообщений: 50
По умолчанию

Код:
	while [ "$minStr" -lt "$maxStr" ] # счетчик количества строк
	do

	minNumber=0  # Сбросить переменную перед началом каждого цикла

		while [ "$minNumber" -lt "$maxNumber" ] # счетчик количества цифр
		do

			number=$(( RANDOM % 35 +1 )) # генерируем значение

				if [ "${seans[$number]}" == "" ]; # если ячейка в массиве не пуста,
				then
					seans[$number]=$number # то присваиваем ей значение

					unset number # очищаем переменную
					# echo "$minStr $minNumber"
					((minNumber ++ )) # увеличиваем счетчик на 1
				fi
	
		done
		unset seans # очищаем массив

	((minStr ++ )) # увеличиваем счетчик строк на 1
	done
Давно решил эту задачу. С помощью массивов.
DS75 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Bash скрипт восстановления файла untrash Gadjett Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 04.05.2013 12:35
bash-скрипт FLEXO_187 Помощь студентам 0 24.01.2013 21:58
bash скрипт monster-bonster Операционные системы общие вопросы 2 24.09.2012 13:54
bash скрипт процессы в фоновом режиме Zerofill Операционные системы общие вопросы 0 04.04.2012 16:51
bash скрипт Rыся Фриланс 3 19.01.2011 13:58