Смысл собственно такой, есть сайт oboobs.ru, нужно генерить прямые линки на картинки.
Код:
public partial class Form1 : Form
{
int i;
public int ze = 0;
public Form1()
{
InitializeComponent();
}
public void doit()
{
for (i = 0; i < ze; i++)
{
listBox1.Items.Add("http://media.oboobs.ru/boobs/" + Next() + ".jpg");
}
}
private void button1_Click(object sender, EventArgs e)
{
ze = Convert.ToInt32(textBox1.Text);
doit();
}
int current;
int _base = 9999;
public int MyRandom()
{
current = DateTime.Now.Millisecond % _base;
return current;
}
public string Next()
{
int d = MyRandom();
current = (int)Math.Round(d * Math.PI + _base);
string gg = Convert.ToString(current);
string tt = gg.Replace('1', '0');
return tt;
}
private void button2_Click(object sender, EventArgs e)
{
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
System.IO.StreamWriter sw = new System.IO.StreamWriter(saveFileDialog1.FileName);
foreach (object item in listBox1.Items)
sw.WriteLine(item.ToString());
sw.Close();
};
}
}
}
Нужно увеличить кпд =), тобиш убирать дубликаты, и перегенеривать линки заново, до нужного значния, тобиш если изначально нужно сгенерить 10к линков, а получилось 600 без дубликатов, то перегенеривать 10к-600, ну и т.д. пока не будет 10к без дубликатов...
З.Ы. Код писалсо на коленке, посему ужасен.
________________
79099c42081131387cabf8f236676a5a
Последний раз редактировалось pixfid; 20.11.2011 в 16:19.
а сразу 10К сгенерировать не вариант?
И добавлять по очереди?
И при добавлении проверять нет ли его, использовать списки например так:
List<string> list=new List<string>();
if(!list.Contains(dobavlyaemoe_zna4enie))
{
list.Add(dobavlyaemoe_zna4enie);
}
Последний раз редактировалось Hermein; 20.11.2011 в 20:22.
Та блин, не в проверке дело, хотя сенкс, так проще, дело в плохом кпд, тобиш как писал выше из из 100к генераций получилось 703 линка из них 694 валидных, вот это и есть плохое кпд
Короче в аттаче сорци.., хз как еще проще объяснить, ВТ НЕТ ибо сорци
Решения как минимум 1:
Изменить сам алго рандомизации.(ибо нужны рандомные линки), перечисление подряд некатит.
Опытным путем доказано что повторение циклов генерации:
Код:
public void doit(int count)
{
str = new string[Convert.ToInt32(textBox1.Text)];
for (int t = 0; t < count;t++)
{
for (int i = 0; i < Convert.ToInt32(textBox1.Text); i++)
{
string zeta = "http://media.oboobs.ru/boobs/" + Next() + ".jpg";
if (!list.Contains(str[i] = zeta) && zeta != "http://media.oboobs.ru/boobs/9999.jpg")
{
list.Add(str[i] = zeta);
}
}
}
}
тобиш doit(Convert.ToInt32(numericUpDown1.Value));, кроме увеличения времени генерации на порядок, практической пользы не приносит...
[Ссылки могут видеть только зарегистрированные пользователи. ]
Как видно из скрина, как не увеличивай количество циклов генераций, лимит 835 значений(уникальных)
З.Ы. Обновил сорец
Update:
Если заменить:
Код:
string tt = gg.Replace('1', '0');
на:
Код:
string tt = ReplaceCharInString(gg,0,'0');
где:
Код:
public String ReplaceCharInString(String source, int index, Char newSymb)
{
StringBuilder sb = new StringBuilder(source);
sb[index] = newSymb;
return sb.ToString();
}
Можно добиться увеличения генерируемых ссылок до 1к, но имхо не панацея...
________________
79099c42081131387cabf8f236676a5a
Последний раз редактировалось Hermein; 21.11.2011 в 03:23.
Возможно я не правильно понял твою проблему, но если ты под валидностью
подразумеваешь не повтор адресов (тем более что эта проблема решена)),
а существование такой страницы в реальности, то проще всего воспользоваться .net классом HttpWebRequest. clickable
•Если вообще, то я бы на твоем месте уделил некоторое время потокам
•И избавил себя от лишних действий, которые местами кривоваты..
__•Рандомизацию к примеру вполне можно было устроить средствами дотНета, да и не только ее explanation
____•Создаешь глобальный объект Random rnd
____•В каждой итерации вызываешь у него функцию Next()
____•Добавляешь переменной рандомное значение повторным вызовом Next(), при чем в твоем случае логично вызывать ее с
______аргументами (1000, 9999), привести ее к строковому типу, и вставить в начало нолик, не знаю правда зачем тебе это
______понадобилось в своем коде
•Path тут твой адрес
Код:
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(path);
hwr.Method="HEAD"; //если тут будет эксепшн - замени на header или что-то в этом роде, а лучше уточни на мсдне, а то вечно что-нибудь путаю))
HttpWebResponse hwresp = hwr.GetResponse();
if(hwresp.StatusCode==HttpStatusCode.OK)
{
List.Add(path);
}
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Возможно я не правильно понял твою проблему, но если ты под валидностью
подразумеваешь не повтор адресов (тем более что эта проблема решена)),
а существование такой страницы в реальности, то проще всего воспользоваться .net классом HttpWebRequest. clickable
•Если вообще, то я бы на твоем месте уделил некоторое время потокам
•И избавил себя от лишних действий, которые местами кривоваты..
__•Рандомизацию к примеру вполне можно было устроить средствами дотНета, да и не только ее explanation
____•Создаешь глобальный объект Random rnd
____•В каждой итерации вызываешь у него функцию Next()
____•Добавляешь переменной рандомное значение повторным вызовом Next(), при чем в твоем случае логично вызывать ее с
______аргументами (1000, 9999), привести ее к строковому типу, и вставить в начало нолик, не знаю правда зачем тебе это
______понадобилось в своем коде
•Path тут твой адрес
Код:
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(path);
hwr.Method="HEAD"; //если тут будет эксепшн - замени на header или что-то в этом роде, а лучше уточни на мсдне, а то вечно что-нибудь путаю))
HttpWebResponse hwresp = hwr.GetResponse();
if(hwresp.StatusCode==HttpStatusCode.OK)
{
List.Add(path);
}
Нет, валидноть, это сущетвование файла на сервере, оно мне както побоку вообщее есть ли файл на сервере или нет...
С отсеиванием одинаковых линков, разобрался, см пост выше.
Мне нужно, норм рандомный генератор, rnd - мусор, надо самопал.
Если ты качал сорци и собирал софтину, то мог заметить что максимум генерится 1к уникальных(без дубликатов) линков, мм...
Нужен норм генератор с диапозоном от (00001 - 09999);
У меня System.Random() повторяет 33% на 10к значений и меньше 10% на 100к... По сравнению с твоими 94-90% весьма оптимально....
Твой алгоритм выполняется слишком быстро, надо усложнять... попробуй добавить число генерируемое Random(), думаю поможет )
UPD: если ты будешь заливать картинки, то перед генерацией нового линка заливай картинку, тогда будет меньше повторов..
Последний раз редактировалось Sinyss; 23.11.2011 в 15:17.
Только что написал небольшой скриптик - из 6000 трушные 5994,
было бы 100% если бы не потоки - иногда проверить не успевает..
Использовал .net'овскийRandom. cliackable
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ] >>C•DE<<
В начале кода поставь костанту AddToMemory в тру, иначе он не будет писать переменные в массив - память грузить не хотелось..
PHP код:
const short ThreadsCount =
45;
const short CollumnsCount =
25;
const int NumsCount = 9999999;
bool AddToMemory =
false;
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.BufferWidth = 550;
Console.BufferHeight = 900;
Console.WindowWidth = 200;
label1:
List<string> items = new List<string>();
Random rnd = new Random();
int iter = 0;
short collumn = 0;
byte th = 0;
Thread[] ths = new Thread[ThreadsCount];
string last = "";
while (iter < NumsCount)
{
if (th == ThreadsCount)
{
th = 0;
}
ths[th] = new Thread(
new ThreadStart(() =>
{
for (byte i = 0; i < th; ++i)
{
ths[i].Join(new TimeSpan(0, 5, 0));
}
int itr;
th = 0;
Console.WriteLine();
List<int> tmp = new List<int>();
if (AddToMemory)
{
for (itr = 0; itr < items.Count - 1; ++itr)
{
if (th == ThreadsCount)
{
th = 0;
}
(ths[th] = new Thread(
() =>
{
if (items.Count(p => (p == items[itr])) > 1)
tmp.Add(itr);
})).Start();
++itr;
++th;
}
for (byte i = 0; i < th; ++i)
{
ths[i].Join(new TimeSpan(0, 5, 0));
}
foreach (int _item in tmp)
items.RemoveAt(_item);
}
Console.Beep();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(string.Format("\r\n{0} generated \t :\t {1}\t valid", iter, items.Count()));
items.Clear(); items = null; ths = null;
if (Console.ReadLine().ToLower() == "again")
goto label1;
=========
added 18:56 24.11.11
=========
...Запустил этот код и повис, наблюдая за зелеными циферками... Надо найти диск с матрицей)
=========
added 20:04 24.11.11
========= Sinyss
Во-первых, вашего сообщения я не видел - извините уж,
Во-вторых, раз уж пошла такая тема - пробежитесь глазами по моему вчерашнему сообщению - во вкладке clickable->explanation я упоминал об этом.
Данный пост с кодом я выложил только что бы пояснить автору сабжа принцип генерации случайных чисел средствами .net. pixfid
Собственно выдираешь из этого кода генерацию значений, чуть-чуть корректируешь работу потоков, дабы полностью избавиться от промахов и вообщем-то mission completed (c) =========
added 20:10 24.11.11
=========
Циферки затягивают...
________________
Ну что лежишь ты Мурка, на краю дороги
Гробоваая крыышкаа над тобооой Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось •theSaboteur•; 23.11.2011 в 20:16.
Причина: Modify