a=random(4);
b=random(4);
while(b==a){b=random(4);}
c=random(4);
while(c==a && c==b){c=random(4);}
d=random(3);
while(d==a && d==b && d==c) {d=random(4);}
написал так, но значения всё равно повторяются
Другие языки программирования и технологии
Есть четыре переменные, нужно рандомом присвоить им значения от 0 до 3, так чтобы значения не повторялись. пишу на Си)
У тебя && вместо ||,
А вообще "нужно рандомом присвоить им значения от 0 до 3, так чтобы значения не повторялись" - это "нужно топором забить гвоздь". Это делается никак не "рандомом", он для этого совершенно не предназначен. Хотя в принципе можно, но, как у тебя в программе, сложнее. Нормально это делается тасованием по алгоритму Кнута. И уж конечно, random(3) никогда не выдаст 3, достаточно прочитать описание этой функции.
А вообще "нужно рандомом присвоить им значения от 0 до 3, так чтобы значения не повторялись" - это "нужно топором забить гвоздь". Это делается никак не "рандомом", он для этого совершенно не предназначен. Хотя в принципе можно, но, как у тебя в программе, сложнее. Нормально это делается тасованием по алгоритму Кнута. И уж конечно, random(3) никогда не выдаст 3, достаточно прочитать описание этой функции.
задайте массив, пусть будет a = {0,1,2,3}
В цикле получаем индекс1 как текущий. И индекс2 со случайным значением от 0 до 4.
Меняем местами значения в массиве с индекс1 и индекс2, соотв a[0] a[1] a[2] a[3] будут (вероятно) не упорядочены и иметь разные значения.
P.S: В C++ есть random_shuffle для таких случаев http://www.cplusplus.com/reference/algorithm/random_shuffle/ , но у Вас C.
P.P.S: Я смотрю никого не смущает условие "так чтобы значения не повторялись." =))
В цикле получаем индекс1 как текущий. И индекс2 со случайным значением от 0 до 4.
Меняем местами значения в массиве с индекс1 и индекс2, соотв a[0] a[1] a[2] a[3] будут (вероятно) не упорядочены и иметь разные значения.
P.S: В C++ есть random_shuffle для таких случаев http://www.cplusplus.com/reference/algorithm/random_shuffle/ , но у Вас C.
P.P.S: Я смотрю никого не смущает условие "так чтобы значения не повторялись." =))
Bogdan Orlioglo
Зачем это черезжопие если есть простой рандом?
эм... Почитай описание функции рандома.... сам посмеёшься....
Bogdan Orlioglo
Вот из-за таких индусов в майкрософте винда и глючит)
Алгоритм тасования Саттоло
http://ideone.com/0AtJpd
http://ideone.com/0AtJpd
int i;
int numPicked;
int rn[4] = { 0,1,2,3};
int result[4];
srand(time(NULL));
for (i = 0;i < 4; i++)
{
while (true)
{
numPicked = rand() % 4;
if (rn[numPicked] < 8)
{
result[i] = rn[numPicked];
rn[numPicked] = 9;
break;
}
}
}
for (i = 0;i < 4; i++)
{
cout << result[i] << " ";
}
system("pause");
Дичь, но работает ))
int numPicked;
int rn[4] = { 0,1,2,3};
int result[4];
srand(time(NULL));
for (i = 0;i < 4; i++)
{
while (true)
{
numPicked = rand() % 4;
if (rn[numPicked] < 8)
{
result[i] = rn[numPicked];
rn[numPicked] = 9;
break;
}
}
}
for (i = 0;i < 4; i++)
{
cout << result[i] << " ";
}
system("pause");
Дичь, но работает ))
)))
Похожие вопросы
- Вывести последовательность из 6 элементов, чтобы значения выбирались случайно из массива , но при этом не повторялись с#
- Что сейчас из себя представляет чистый Си? Что пишут на Си? Если пишут, то почему не на С++?
- C# Поле класса. Как присвоить не значение, а ссылку? Пример внутри.
- Как перевести эти числа буду благодарен:1)0,2122(3)-?(10) 2)3,1415(10)-?(8) 3) 0,2122(8)-?(2) 4)0,1100011(2)-?(10) (((
- Visual Basic 6.0. Как изменить значение Left=0 так, чтобы имелась ввиду правая сторона экрана, а не левая ?
- Как задать двумерный массив на C#, чтобы значения можно было писать при запуске программы?
- Даны 2 матрицы 2х3. Нужно поменять местами наибольшее значение из 1 с наименьшим из 2. На C++
- Стрелка вверх, 5/4, стрелка вниз, А, 0,2, 3, 4, F - что значат эти символы на калькуляторе?
- как в с++ возвращать значение функции больше одного? допустим сразу несколько значений
- Как вернуть значение переменной присвоенное ранее? Pascal