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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2017, 20:06   #11
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Лично я думаю, что помощь будет гораздо более эффективной, если Вы более внятно объясните, что именно Вам нужно перемешать и зачем. Пока же больше похоже на классическую проблему XY
Black Fregat вне форума Ответить с цитированием
Старый 04.09.2017, 20:26   #12
Ar2emiS
Пользователь
 
Регистрация: 18.10.2016
Сообщений: 27
По умолчанию

Необходимо перемешать длинную последовательность, которая находится в файле.
Результат также записать в файл.
Ar2emiS вне форума Ответить с цитированием
Старый 04.09.2017, 20:31   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Прочитать то все равно нужно в память, MemoryStream например и в нем побайтно, как в массиве свапить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.09.2017, 20:32   #14
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Мысленно разбиваем последовательность на N кусков,
размером RAND_MAX + 1 каждый, кроме последнего, конечно же.
Дальше всё сводится к выбору рандомного "куска"
и рандомному выбору в нем элемента.
Последний кусок можно обработать отдельно.


А можно и свой ГПСЧ накатать.
Croessmah вне форума Ответить с цитированием
Старый 04.09.2017, 21:09   #15
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
А можно и свой ГПСЧ накатать.
Осталась статейка в закладках.
https://habrahabr.ru/post/208178/
Мановар вне форума Ответить с цитированием
Старый 04.09.2017, 22:14   #16
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Ar2emiS Посмотреть сообщение
Необходимо перемешать длинную последовательность, которая находится в файле.
Результат также записать в файл.
Если символы в 1-байтной кодировке, то: генерируете случайное число от нуля до количества символов в файле. Первый символ из файла сохраняете во временную переменную, а вместо него пишете символ с индексом <сгенерированное случайное число>. Опять генерируем число и меняем тот символ, что сохранили предварительно с тем, чей индекс сгенерировали. И так сколько-нибудь много итераций делаем, чем больше - тем сильнее всё перемешается. Памяти лишней не понадобится, если большая вероятность, что будут целые группы символов, оставшихся на своих местах.
pu4koff вне форума Ответить с цитированием
Старый 04.09.2017, 22:26   #17
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Можно алгоритм Фишера-Йетса реализовать прямым доступом к файлу. Правда скорость будет не ахти.
Arigato вне форума Ответить с цитированием
Старый 04.09.2017, 23:05   #18
Ar2emiS
Пользователь
 
Регистрация: 18.10.2016
Сообщений: 27
По умолчанию

Спасибо за идеи, подумаю, как лучше реализовать.
Ar2emiS вне форума Ответить с цитированием
Старый 06.09.2022, 17:36   #19
Greyson88
Новичок
Джуниор
 
Регистрация: 06.09.2022
Сообщений: 1
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Нужно равномерное распределение. Можно вот так вычислить большое случайное число:
Код:
// Случайное число от 0 до 1 млрд
long lrand(long max){
	long rnd=
		1000000*(rand()%1000)+ // миллионы
		1000*(rand()%1000)+ // тысячи
		rand()%1000; // единицы
	return rnd%max;
}

int main(){
	srand(time(NULL));
	
	for(int i=0; i<100; i++)
		printf("%d\n", lrand(70000000));
	
	getch();
	return 0;
}
Какое будет у него распределение - не знаю.
Код:
return rand()*rand();
Как минимум контрпример: если ноль выпадает в левой или в правой части, в произведении получаем ноль. То есть вероятность нуля выше любого другого значения.
Совершенно верно
Greyson88 вне форума Ответить с цитированием
Старый 07.09.2022, 00:47   #20
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 491
По умолчанию

Цитата:
Сообщение от Ar2emiS Посмотреть сообщение
Стоит задача случайно перемешать последовательность символов
Зачем?
Valick вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение самой длинной последовательности ARV.net C# (си шарп) 7 03.11.2012 13:06
Перемешивание массива revaldo666 Общие вопросы C/C++ 6 19.01.2011 15:04
Перемешивание строк gamer123 Общие вопросы Delphi 17 25.08.2010 20:10
Текст в очень длинной таблице ANG3 Microsoft Office Word 2 27.01.2010 19:58
Перемешивание строк Черничный БД в Delphi 3 15.07.2008 14:11