aramsoft
سه شنبه 13 آبان 1393, 16:35 عصر
سلام دوستان من یه ماتریس دارم که سطر و ستون هاش رو از ورودی گرفتم وتعدادی عدد در این ماتریس قرار داره یه سری از عدد این ماتریس 1- که من می خوام به جای این 1- ها اعداد تصادفی بذارم اما اعداد تصادفی با مقدار های قبلی ماتریس برابر نباشه (یعنی عدد تکراری در ماتریس قرار نگیره)
برای مثال :
2 5 4 3
1- 4 7 1
6 1- 8 11
خروجی بشه:
2 5 4 3
12 4 7 1
6 9 8 11
کسی می تونه کمک کنه؟
باید انتخاب 1- ها هم به صورت تصادفی باشه نه ترتیبی
مسعود اقدسی فام
سه شنبه 13 آبان 1393, 18:58 عصر
این مثالی که زدید خودش قبل از تعویض 1- هم تکرار داره!
مشکل شما بررسی تکراری بودن عدد هست؟ این اعداد محدودهی خاصی دارن؟ ابعاد ماتریس چطور؟
iut.ali
سه شنبه 13 آبان 1393, 19:48 عصر
سلام دوستان من یه ماتریس دارم که سطر و ستون هاش رو از ورودی گرفتم وتعدادی عدد در این ماتریس قرار داره یه سری از عدد این ماتریس 1- که من می خوام به جای این 1- ها اعداد تصادفی بذارم اما اعداد تصادفی با مقدار های قبلی ماتریس برابر نباشه (یعنی عدد تکراری در ماتریس قرار نگیره)
برای مثال :
2 5 4 3
1- 4 7 1
6 1- 8 11
خروجی بشه:
2 5 4 3
12 4 7 1
6 9 8 11
کسی می تونه کمک کنه؟
باید انتخاب 1- ها هم به صورت تصادفی باشه نه ترتیبی
خب میتونی یه وکتور از اعداد درست کنی و هر بار که عددی رو وارد کردی اگه -1 بود با تابع rand() یه عدد بگیری حالا اگه این عدد توی وکتورت وجود داشت یه عدد دیگه بگیری
rahnema1
سه شنبه 13 آبان 1393, 20:43 عصر
سلام
مثلا اگه بخواهید اعداد تصادفی بین 0 تا 20 باشه میشه اینجور نوشت به جای unordered_set میشه از set هم استفاده کرد
#include <iostream>
#include <unordered_set>
#include <algorithm>
#include <chrono>
#include <vector>
int main ()
{
std::default_random_engine generator( std::chrono::system_clock::now( ).time_since_epoch() .count());
std::uniform_int_distribution<int> distribution(0, 20);
std::pair< std::unordered_set<int >::iterator,bool> ret;
std::vector<std::pair<int, int> > candidates;
std::unordered_set<int > index;
std::vector<std::vector<int> > mat = {{3, 4, 5, 2},
{1, 7, 4, -1},
{11, 8, -1, 6}};
for (int i = 0; i < mat.size(); i++)
for (int j = 0; j < mat[0].size(); j++)
{
if (mat[i][j] == -1 )
candidates.push_back( {i, j});
else
index.insert( mat[i][j]);
}
std::shuffle(candidates.begin(), candidates.end(), generator);
for (auto && c: candidates)
{
do
{
ret = index.insert( distribution(generator));
}
while(!ret.second);
mat[c.first][c.second] = *ret.first;
}
for (int i = 0; i < mat.size(); i++)
{
for (int j = 0; j < mat[0].size(); j++)
std::cout << mat [i][j] << ",";
std::cout << std::endl;
}
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.