C 随机化4个不同的数字
我尝试用C将4个不同的数字随机化,并尝试下一个代码:C 随机化4个不同的数字,c,C,我尝试用C将4个不同的数字随机化,并尝试下一个代码: { int num1 = 0, num2 = 0, num3 = 0, num4 = 0; int i = 0; while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num
{
int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
int i = 0;
while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num3 == num2)
{
num1 = rand() % 7;
num2 = rand() % 7;
num3 = rand() % 7;
num4 = rand() % 7;
}
printf("%d %d %d %d\n", num1, num2, num3, num4);
}
代码假设检查这些数字是否相等,如果它们相等,则需要生成新的数字,直到它们完全不同。
但由于某些原因,它不能很好地工作,即使是正确的数字,它也会把它们当作错误的数字,变成一个无休止的循环
我错过了什么?试着这样做
void
get_random_values(int *values)
{
int source[] = {0, 1, 2, 3, 4, 5, 6};
for (int i = 0 ; i < 7 ; ++i)
{
int saved;
int j = rand() % 7;
int k = rand() % 7;
saved = source[j];
source[j] = source[k];
source[k] = saved;
}
values[0] = source[0];
values[1] = source[1];
values[2] = source[2];
values[3] = source[3];
}
int
main(void)
{
int values[4];
srand(time(NULL));
get_random_values(values);
for (int i = 0 ; i < 4 ; ++i)
fprintf(stderr, "%d ", values[i]);
fprintf(stderr, "\n");
return 0;
}
void
获取随机值(int*值)
{
int source[]={0,1,2,3,4,5,6};
对于(int i=0;i<7;++i)
{
保存整数;
int j=rand()%7;
int k=rand()%7;
保存=源[j];
源[j]=源[k];
源[k]=已保存;
}
值[0]=源[0];
值[1]=源[1];
值[2]=源[2];
值[3]=源[3];
}
int
主(空)
{
int值[4];
srand(时间(空));
获取随机值(值);
对于(int i=0;i<4;++i)
fprintf(标准,“%d”,值[i]);
fprintf(标准格式,“\n”);
返回0;
}
不要忘了在程序启动时设置随机种子srand()
,否则您将始终获得相同的序列。像这样尝试
void
get_random_values(int *values)
{
int source[] = {0, 1, 2, 3, 4, 5, 6};
for (int i = 0 ; i < 7 ; ++i)
{
int saved;
int j = rand() % 7;
int k = rand() % 7;
saved = source[j];
source[j] = source[k];
source[k] = saved;
}
values[0] = source[0];
values[1] = source[1];
values[2] = source[2];
values[3] = source[3];
}
int
main(void)
{
int values[4];
srand(time(NULL));
get_random_values(values);
for (int i = 0 ; i < 4 ; ++i)
fprintf(stderr, "%d ", values[i]);
fprintf(stderr, "\n");
return 0;
}
void
获取随机值(int*值)
{
int source[]={0,1,2,3,4,5,6};
对于(int i=0;i<7;++i)
{
保存整数;
int j=rand()%7;
int k=rand()%7;
保存=源[j];
源[j]=源[k];
源[k]=已保存;
}
值[0]=源[0];
值[1]=源[1];
值[2]=源[2];
值[3]=源[3];
}
int
主(空)
{
int值[4];
srand(时间(空));
获取随机值(值);
对于(int i=0;i<4;++i)
fprintf(标准,“%d”,值[i]);
fprintf(标准格式,“\n”);
返回0;
}
不要忘记在程序启动时设置随机种子
srand()
,否则您将始终获得相同的序列。此代码将在0范围内选择4个不同的数字。。它的工作原理是创建一个可用数字数组,当每个数字都被选中时,它就会从列表中删除
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 7 // how many different numbers
#define PICK 4 // how many to pick
int main(void) {
int pool[RANGE];
int size, n, i;
for (size=0; size<RANGE; size++) {
pool[size] = size; // create number pool 0..6
}
srand((unsigned)time(NULL));
// pick different numbers
for(i=0; i<PICK; i++) {
n = rand() % size; // random array index
printf("%d ", pool[n]); // select number from pool
pool[n] = pool[--size]; // remove from pool
}
printf("\n");
return 0;
}
#包括
#包括
#包括
#定义范围7//有多少不同的数字
#定义拾取4//要拾取的数量
内部主(空){
int池[范围];
int大小,n,i;
对于(size=0;size此代码将在0..6范围内选取4个不同的数字,其工作方式是创建一个可用数字的数组,当选取每个数字时,它将从列表中删除
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define RANGE 7 // how many different numbers
#define PICK 4 // how many to pick
int main(void) {
int pool[RANGE];
int size, n, i;
for (size=0; size<RANGE; size++) {
pool[size] = size; // create number pool 0..6
}
srand((unsigned)time(NULL));
// pick different numbers
for(i=0; i<PICK; i++) {
n = rand() % size; // random array index
printf("%d ", pool[n]); // select number from pool
pool[n] = pool[--size]; // remove from pool
}
printf("\n");
return 0;
}
#包括
#包括
#包括
#定义范围7//有多少不同的数字
#定义拾取4//要拾取的数量
内部主(空){
int池[范围];
int大小,n,i;
对于(size=0;size获得随机序列:
#include <stdio.h>
#include <stdlib.h>
#define N 7
int main(int argc, char **argv)
{
// seed random number generator with first argument for easier testing
if (argc > 1) {
srand(atoi(argv[1]));
}
int array[N] = {0,1,2,3,4,5,6};
// Fisher–Yates shuffle:
// https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
for (unsigned i = 0; i < N - 1; ++i) {
unsigned modulo = N - i;
// unbiased rand() % modulo:
// https://stackoverflow.com/a/10989061/416224
unsigned j;
do {
j = rand();
} while (j >= RAND_MAX - (RAND_MAX % modulo));
j %= modulo;
if (j > 0) {
int tmp = array[i];
array[i] = array[i + j];
array[i + j] = tmp;
}
}
for (unsigned i = 0; i < N; ++i) {
printf("%u. %d\n", i + 1, array[i]);
}
return 0;
}
#包括
#包括
#定义n7
int main(int argc,字符**argv)
{
//带有第一个参数的种子随机数生成器,便于测试
如果(argc>1){
srand(atoi(argv[1]);
}
int数组[N]={0,1,2,3,4,5,6};
//费舍尔-耶茨洗牌:
// https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
for(无符号i=0;i=RAND_MAX-(RAND_MAX%模));
j%=模;
如果(j>0){
int tmp=数组[i];
数组[i]=数组[i+j];
阵列[i+j]=tmp;
}
}
for(无符号i=0;i
请按照代码中的参考链接进行操作。获取随机序列:
#include <stdio.h>
#include <stdlib.h>
#define N 7
int main(int argc, char **argv)
{
// seed random number generator with first argument for easier testing
if (argc > 1) {
srand(atoi(argv[1]));
}
int array[N] = {0,1,2,3,4,5,6};
// Fisher–Yates shuffle:
// https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
for (unsigned i = 0; i < N - 1; ++i) {
unsigned modulo = N - i;
// unbiased rand() % modulo:
// https://stackoverflow.com/a/10989061/416224
unsigned j;
do {
j = rand();
} while (j >= RAND_MAX - (RAND_MAX % modulo));
j %= modulo;
if (j > 0) {
int tmp = array[i];
array[i] = array[i + j];
array[i + j] = tmp;
}
}
for (unsigned i = 0; i < N; ++i) {
printf("%u. %d\n", i + 1, array[i]);
}
return 0;
}
#包括
#包括
#定义n7
int main(int argc,字符**argv)
{
//带有第一个参数的种子随机数生成器,便于测试
如果(argc>1){
srand(atoi(argv[1]);
}
int数组[N]={0,1,2,3,4,5,6};
//费舍尔-耶茨洗牌:
// https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
for(无符号i=0;i=RAND_MAX-(RAND_MAX%模));
j%=模;
如果(j>0){
int tmp=数组[i];
数组[i]=数组[i+j];
阵列[i+j]=tmp;
}
}
for(无符号i=0;i
请按照代码中的参考链接操作。我建议通用解决方案:
- 任意大小的数组
- 下限和上限作为参数发送
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void random(int* values, int amount, int lower_bound, int upper_bound)
{
int i=0, j=0, temp;
if(amount > upper_bound - lower_bound + 1)
return; // if there are more numbers than given bound
for(i=0; i<amount; )
{
temp = rand() % ( upper_bound - lower_bound + 1 ) + lower_bound;
for(j=i-1; j>=0; --j)
if(temp==values[j])
break;
if(temp==values[j])
continue;
values[i]=temp;
++i;
}
}
int main()
{
srand(time(NULL));
int arr[4]={0,0,0,0};
random(arr, 4, 5, 10);
for(int i=0; i<4; ++i)
printf("%d\n", arr[i]);
}
#包括
#包括
#包括
void random(int*值、int金额、int下限、int上限)
{
int i=0,j=0,温度;
如果(金额>上限-下限+1)
return;//如果有超过给定范围的数字
对于(i=0;i=0;--j)
如果(温度==值[j])
打破
如果(温度==值[j])
继续;
数值[i]=温度;
++一,;
}
}
int main()
{
srand(时间(空));
int arr[4]={0,0,0,0};
随机(arr,4,5,10);
对于(int i=0;i我建议通用解决方案:
- 任意大小的数组
- 下限和上限作为参数发送
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void random(int* values, int amount, int lower_bound, int upper_bound)
{
int i=0, j=0, temp;
if(amount > upper_bound - lower_bound + 1)
return; // if there are more numbers than given bound
for(i=0; i<amount; )
{
temp = rand() % ( upper_bound - lower_bound + 1 ) + lower_bound;
for(j=i-1; j>=0; --j)
if(temp==values[j])
break;
if(temp==values[j])
continue;
values[i]=temp;
++i;
}
}
int main()
{
srand(time(NULL));
int arr[4]={0,0,0,0};
random(arr, 4, 5, 10);
for(int i=0; i<4; ++i)
printf("%d\n", arr[i]);
}
#包括
#包括
#包括
void random(int*值、int金额、int下限、int上限)
{
int i=0,j=0,温度;
如果(金额>上限-下限+1)
return;//如果有超过给定范围的数字
对于(i=0;i=0;--j)
如果(温度==值[j])
打破
如果(温度==值[j])
继续;
数值[i]=温度;
++一,;
}
}
int main()
{
srand(时间(空));