随机数独生成

我正在编写一个函数,可以为模拟项目生成随机的数独游戏; 这个函数将生成的单元格数作为argoument,然后生成要放入这些单元格的单元格和数字的索引。 我在生成单元格索引时遇到问题,我不是编程专家,我找不到一个好的例程来生成索引,并且检查不是两次或更多次的同一索引。 function是:

void gen_puzzle(int quanti) { if(quanti>81) exit(1); indexes* ij=new indexes[quanti]; int f,g,k, controllo=1; do { for(f=0; f<9; f++) for(g=0; g<9; g++) { puzzle[f][g].num=0;//puts 0 in the sudoku puzzle puzzle[f][g].p=0; } //////////////section to improve out: srand(int(time(0)+clock())); for(k=0; k<quanti; k++) ij[k].i=casuale()-1, ij[k].j=casuale()-1;//generates random indexes of sudoku cells where put random nubers for(f=0; f<quanti; f++) for(g=f+1; g<quanti; g++) { if(ij[f].i==ij[g].i && (ij[f].j==ij[g].j)) goto out; } //////////////////// for(k=0; k<quanti; k++) puzzle[ij[k].i][ij[k].j] . num=casuale();//puts random numbers in cells } while(dataNotGood()); //till sudoku isn't good } 

我请求函数在ij[]数组中放置随机索引的部分,我使用了goto但它不是一个好的解决方案,如果quanti大于17左右,它就不能正常工作。
casuale()只返回1到9之间的随机数。

首先,我将删除所有#pragma omp parallel指令,直到你有代码#pragma omp parallel 。 现在它只是降低了可读性。

其次,如果你想生成“未解决的”数独(即那些大多数未填写的数据),你通常会做的是随机填写几个数字,然后通过让计算机解决它来测试数独。 如果comupter成功,则意味着你开始使用适当的数独游戏。 在这里,您可以找到解决sudokus的算法的一个很好的解释。

第三,要注意你想要放入数独谜题中的数字受到很大限制。 如果3×3块(或9×1行或列)包含1,则无法向块(行,列)添加额外的1,如果9×9块包含9个1,则无法向其添加额外的1,等等所以可能最好用你可以添加的所有数字填充一个数组数组(所有3×3块的九个数组1-9)并随机从这些数组中取出元素并将它们放入相应3×3块中的拼图中。 这样,您至少可以避免将重复数字添加到同一个3×3块的情况。

您不需要随机数生成算法。 您已经知道这些数字:它们是唯一的,并且在1..n范围内,其中对于大小为9×9或更小的数独板, n应该<= 9 。 你需要的是一种方法来改变数字1..n ,然后将它们分配给'指数'。 为了改组, Fisher-Yates shuffle非常简单,高效。

使用它将消除随机数生成的需要,并且希望也可以使用goto

我的建议是:使用其他地方找到的算法创建一个完整的(已解决的)拼图,然后随机擦除一定比例的单元格。